Commit Graph

86 Commits

Author SHA1 Message Date
Markus Moll a3fb17c8de Use elliptical trust region in DoglegStrategy.
In the Levenberg-Marquardt algorithm, the diagonal of J^T J is used to
regularize the problem. This corresponds to an elliptical trust region
|| D step || <= r, where D = sqrt(diag(J^T J)).

This commit adds the same elliptical trust region to the dogleg
strategy. The trust region problem becomes

  min. x^T H x + g^T x
  s.t. || D x || <= r

By substituting y = D x, it becomes

  min. y^T D^-1 H D^-1 y + g^T D^-1 y
  s.t. || y || <= r

which is the traditional spherical trust region problem.
This commit changes the DoglegStrategy so that the Gauss-Newton point,
the gradient, and the Cauchy point are scaled correctly (without
modifying the Jacobian directly). Then the dogleg step is computed the
same way as before, and finally the step is rescaled to obtain
x = D^-1 y.

Change-Id: Iea25a9113ecba911b746e269bc6e6fe51cb59003
2012-08-15 12:01:13 -07:00
Sameer Agarwal 62f50d1466 Move internal/ceres/mock_log.h to internal/ceres/gmock/mock-log.h
Change-Id: I652b25b7bfb56edf814d73f2dd7c796f9af983d5
2012-08-14 14:26:13 -07:00
Sameer Agarwal 9bdb6cc759 Rename macro to avoid namespace conflicts.
Change-Id: Iecf00f67dcd6250d6919875cee79a600fccab039
2012-08-14 13:02:20 -07:00
Sameer Agarwal c6bbecf26d Consolidate path handling for test data files.
Added CERES_TEST_SRCDIR_POSTFIX macro.
Added TestFileAbsolutePath function.

Change-Id: I223b74af027bfb775447e062edab897395b21514
2012-08-14 11:35:13 -07:00
Sameer Agarwal bc0a857fce Remove unused variable in evaluate_test.cc
Change-Id: Id5a4abb35d4b86c67dc2c9b0ac59a4950825a23d
2012-08-14 08:27:26 -07:00
Sameer Agarwal 0beab86dfa Fix glog includes and include sorting order.
Change-Id: I0ec85218e82d1714279d41f7635104d480fb91c3
2012-08-13 15:47:24 -07:00
Keir Mierle f18cc4a0d0 Fix copy and paste error.
Change-Id: Ie28196d44e163d26b09131687ef56f5f8cc77ac7
2012-08-13 11:36:17 -07:00
Keir Mierle ff71d74967 Further encapsulate Ceres's Mutex class.
There are cases where one wishes to link Ceres against another
application or library which uses a mutex implementation with
similar ancestry to the one in Ceres. In those cases there are
problems due to macro interactions which can't be contained with
namespaces.

This further isolates the Ceres Mutex class by adding CERES_
prefix to all the macros and also working around a macro name
clash with MutexLock by renaming the MutexLock class to
CeresMutexLock.

Change-Id: I923f4427d5939823ea67d48005a90391736d7751
2012-08-10 17:56:38 -07:00
Keir Mierle aff5a45378 Use the correct namespace for tr1 references.
Change-Id: I130bf9a7c811a2ec14425e007108279e60296035
2012-08-10 16:58:56 -07:00
Keir Mierle 716e2945fe Fix initialization order.
Change-Id: Ia854ce2878b5d39e167176556cccaadea4c98068
2012-08-10 16:53:37 -07:00
Keir Mierle 4d84182acc Remove unused variable.
Change-Id: Ic8de7931be8ac51f583eaa5da73178aa0a38122b
2012-08-10 16:41:00 -07:00
Sameer Agarwal 1b7f3b52fb Add ability to log solver execution to file.
Change-Id: I9996ba2fed5229fe5d621fbb1a027d4c360cd59d
2012-08-10 15:55:31 -07:00
Sameer Agarwal 5476df506e Randomly perturb the bundle adjustment problem.
1. Add the ability to perturb the camera pose and the
point positions using user specified parameters.
2. Re-order the flags.
3. Minor name correction.
4. Added Box-Mueller generator to random.h

Change-Id: I2c9ce74c237f5bde9a7299cc71b205d1ca9bc742
2012-08-10 11:33:59 -07:00
Sameer Agarwal a8f87d7943 Non-monotonic trust region algorithm.
Non-monotonic trust region algorithm based on the work of Phil Toint, as
described in

Non-monotone trust region algorithms for nonlinear
optimization subject to convex constraints.
Philippe L. Toint
Mathematical Programming 77 (1997), 69-94.

Change-Id: I199ecc644e8d1a8cb43666052aef66fb93e15569
2012-08-10 11:09:12 -07:00
Keir Mierle ebcfdf4c65 Fix formatting in the polynomial rootfinder.
Change-Id: I771793bbabad30cdc4b369d37cae846e541c6f77
2012-08-08 10:33:06 -07:00
Sameer Agarwal 2278ec4f9e Fix off by one error in the polynomial solver
Change-Id: I682525a911ce62b6e057072ce396723c7249df1b
2012-08-02 18:57:18 -07:00
Keir Mierle aefb8a8cf2 Preliminary Android port of Ceres
This change adds several of the pieces needed to build Ceres on
Android. The port is incomplete, since GFlags doesn't build which
causes the tests to not build. However, simple_bundle_adjuster
builds and runs on the phone.

Thanks to Scott Ettinger for the original version of the minimal
GLog implementation which made this port possible. The Ceres logs
go to the various Android logging levels, as documented in
miniglog/glog/logging.h.

To control the Android build, this adds a new CMake build option:

  -DBUILD_ANDROID=ON/OFF

However, users may not want to set this manually, and should
instead run the script found in android/build_android.sh. The
script calls the NDK to make a standalone toolchain, downloads the
android-cmake toolchain, then configures CMake to cross-compile
Ceres to Android.

Note: At time of writing, the android-cmake toolchain that the
script downloads from Google Code doesn't work with the latest
Jellybean NDK. It's possible to manually hack the toolchain file
to make it build by setting the compiler version and manually
setting the path to the STL includes. I don't yet have a patch
suitable for upstreaming to http://android-cmake.googlecode.com.

Change-Id: Icb615be203145e87413d6acd05883171a395499d
2012-08-02 18:35:16 -07:00
Markus Moll c9eca7812a Add a polynomial solver
Add a function to find the (complex) roots of a polynomial
with real coefficients. The roots are extracted as the
eigenvalues of the (balanced) companion matrix. Also adds a test.
The polynomial solver will be needed in the Dogleg subspace
strategy.

Change-Id: Ia6626158819efb858522b7f4998649ca010d6688
2012-07-26 22:26:21 +02:00
Keir Mierle 385377098e Don't build a shared library on Windows.
Change-Id: Ia3f3957d5f63f5e99e31a84367bb1507fef6618d
2012-07-19 14:00:16 -07:00
Keir Mierle c161a9d0b8 Fix build break.
Change-Id: I0f2e70b91528a8a7567ecf5ca71315962786d937
2012-07-18 14:01:48 -07:00
Keir Mierle 05107ba99f Add a Ceres version and use it to name the DLL.
Change-Id: Ia7adff8219af66d3c7fbb2e1e39da396323ba545
2012-07-18 13:50:12 -07:00
Markus Moll 8de78dbadb Compute summary->fixed_cost while the residual blocks are removed
Change-Id: Ib598316ad21606f1a06db48c341a5f1d69915b2b
2012-07-18 18:33:54 +02:00
Sameer Agarwal 1d7c49224a Add shared library targets.
Fix a grammo from a previous CL.

Change-Id: Icc683d3a73a542519a6ccefc0f653664f236c24b
2012-07-17 10:23:35 -07:00
Sameer Agarwal 4997cbc437 Return jacobians and gradients to the user.
1. Added CRSMatrix object which will store the initial
   and final jacobians if requested by the user.
2. Conversion routine and test for converting a
   CompressedRowSparseMatrix to CRSMatrix.
3. New Evaluator::Evaluate function to do the actual evaluation.
4. Changes to Program::StateVectorToParmeterBlocks and
   Program::SetParameterBlockStatePtrstoUserStatePtrs so that
   they do not try to set the state of constant parameter blocks.
5. Tests for Evaluator::Evaluate.
6. Minor cleanups in SolverImpl.
7. Minor cpplint cleanups triggered by this CL.

Change-Id: I3ac446484692f943c28f2723b719676f8c83ca3d
2012-07-16 12:17:34 -07:00
Sameer Agarwal 451623a5a1 Fix use of uninitialized arrays.
gradient_checking_cost_function_test.cc was using arrays without initializing
them which triggers valgrind errors, and causes failures when built on the N900.

Thanks to Sebastian Koch for reporting the error and Markus Moll for pin pointing
the cause of the error.

Change-Id: Iee498969bb5026eb302ea2990edf189e70f97800
2012-07-11 11:15:25 -07:00
Keir Mierle f44907f702 Compute the gradient if requested in the evaluator
This extends the Evaluator interface to support evaluating the
gradient in addition to the residuals and jacobian, if requested.

   bool Evaluate(const double* state,
                 double* cost,
                 double* residuals,
                 double* gradient,  <----------- NEW
                 SparseMatrix* jacobian) = 0;

The ProgramEvaluator is extended to support the new gradient
evaluation. This required some gymnastics around the block
evaluate preparer, which now contains a scratch evaluate preparer
for the case that no jacobian is requested but the gradient is.

Gradient evaluation is a prerequisite for the planned suite of
first order methods, including nonlinear conjugate gradient,
CG_DESCENT, L-BFGS, trust region with line search, and more.

This also considerably refactors the evaluator_test to make it
shorter and check the results for all combinations of the optional
parameters [residuals, gradient, jacobian].

Change-Id: Ic7d0fec028dc5ffebc08ee079ad04eeaf6e02582
2012-07-11 09:44:45 -07:00
Keir Mierle 9d5fea19f1 Fix minor include and formatting issues.
Change-Id: I14417b775b4d67bba8b0bbbb37fc0b37efc20fbf
2012-06-24 23:36:40 -07:00
Keir Mierle efe7ac60a0 Port Ceres to Windows
This is a preliminary, but full, port of Ceres to Windows.
Currently all tests compile and run, with only system_test
failing to work correctly due to a path issue.

Change-Id: I4152c1588bf51ffd7f4d9401ef9759f5d28c299c
2012-06-24 23:22:04 -07:00
Keir Mierle 58ede2772e Add a portable floating point classification API
Ceres has traditionally battled with portability issues
when trying to classify floating point values as one
type or another. For example, in C99 'isnan' is a
macro. Since it is a macro, it is impossible to
override the name in other namespaces.

Instead of trying to use preprocessor hacks to work
around the issue, define our own set of camel-case
names for use internally and by Ceres clients. For
example do this:

  template<typename T>
  void MyFunction(T x, T y) {
    if (ceres::IsNaN(x)) {
      ...
    }
  }

instead of using "isnan" or "std::isnan". Note that
while GCC and Apple GCC both import 'isnan' into
the std namespace, it is not standard until C++11
which Ceres will not require for some years.

Change-Id: Ibcc96a8bb4ba63aa67cbbc58658b2e5671cd5824
2012-06-24 17:42:53 -07:00
Sameer Agarwal a2e4dc7429 suitesparse_test is enabled even when -DSUITESPARSE=OFF.
Fixed so that suitesparse_test is not compiled if SuiteSparse
support is not enabled.

Change-Id: If6430c3eb42548742d667d876492fff5687fd87d
2012-06-24 11:38:00 -07:00
Keir Mierle 6196cba4e5 Fix broken constant parameter blocks
This fixes the bug introduced in a previous commit,
and adds a test to check that constant parameter
blocks work as expected.

This also refactors the Solver/SolverImpl split so
that SolverImpl is no longer a friend of Problem;
instead, Solver is. This makes it possible to
verify the invariant on parameter block states in
the unit test, and is a more symmetric design
anyway.

Bug: 51
Change-Id: Id503f5b526cfb8bc24aae3aaad2e414b14063d78
2012-06-19 00:09:53 -07:00
Sameer Agarwal 4a6cc1c410 Various fixes repored by Markus Moll.
1. Termination type was using == instead of =.
2. LevenbergMarquardtStrategyTest was using an object
   which was not returning the correct value.
3. DumpLinearLeastSquaresProblemToTextFile was passing an
   unnecessary argument to StringAppendF.

Change-Id: Ie7598c8e3d504763c889737a0d5cec805d52bbaf
2012-06-18 11:17:52 -07:00
Sameer Agarwal eb893404fa Fix alignment issues with Jets.
1. Test that reproduces the failure on macos.
2. Move the alignment macros from manual_constructor.h
   to macros.h and rename them to prevent conflicts.
3. The inline array used by FixedArray is now aligned.
4. Jet has been modified to be eigen friendly.

Change-Id: I4563847a767a92156dabab1ab420f0cdddb8ba77
2012-06-18 11:08:20 -07:00
Keir Mierle f747183ec0 Fix user iteration callbacks.
User callbacks got broken at some point due to the extra
layer of copying from Solver::Options to Minimizer::Options.
This copies the user callbacks when initializing
Minimizer::Options from Solver::Options, and adds a test to
this effect.

This also fixes a bug where the state updating callback was
not called before the user callbacks. This also adds a test
to solver_impl_test to ensure the state updating callbacks
work as expected.

Thanks to Luis Alberto Zarrabeitia for the report.

Issue: 46
Change-Id: I2b36415c89dafaa5c84ecaa727a325df122e1092
2012-06-18 00:49:58 -07:00
Keir Mierle 57d91f5e9e Don't assume program state is user state
The SolverImpl::Solve() method incorrectly assumed that the
state pointers inside the parameter blocks always pointed to
the user state at the start of the method. That is not true.

Change-Id: I73f8eeda453422c99e09d71a3cd0bfa92dd45742
2012-06-17 23:45:23 -07:00
Sameer Agarwal 5ecd2518e5 Check that the Dogleg Solver uses a direct solver.
Change-Id: I7947361542aecded0adc0ca775b5b0011ce9fb23
2012-06-17 19:55:18 -07:00
Sameer Agarwal 97fb6d9715 Documentation & Logging cleanups.
1. Document the use of dogleg and a general discussion of
   trust region methods.
2. Added a TBD section on compiler/linker flags.
3. Summary::FullReport now prints out sparse_linear_algebra_library
   and trust_region_strategy_type.

Change-Id: I01f680070d510715900f345364855689005d54bb
2012-06-17 18:59:34 -07:00
Sameer Agarwal 32808202dc Do not dereference an iterator when it point to the end.
Thanks to Markus Moll for catching my broken fix from a previous change.

Change-Id: I37d0185cfc6f86d0c31f580ca988577abc168ab5
2012-06-15 15:02:23 -07:00
Sameer Agarwal 59534c193b Trust region strategy destructor is not virtual.
Thanks to Markus Moll for reporting this.

Change-Id: I8b7c8fa6b16a5127a2674acddb804ec5f45455ce
2012-06-15 14:36:27 -07:00
Sameer Agarwal 469bf392ad Fixed an invalid DCHECK in suitesparse.cc
There was a overzealous DCHECK in suitesparse.cc when converting
a scalar matrix into a block matrix. This stemmed from my poor
understanding of how lower_bound works.

The test for this function was not stringent enough, and was
not run in debug mode for this to get triggered. The test
has been updated, it fails without the fix and runs correctly
with it.

Thanks to Markus Moll for reporting this and suggesting the
fix.

Change-Id: Ide6b971fd4c618ef5e240f500f514c4b78d7b6e3
2012-06-14 06:59:46 -07:00
Sameer Agarwal 4441b5b2b8 TrustRegionMinimier tests for Dogleg strategy.
Also a fix for a minor segfault in trust_region_minimizer.cc
which was discovered while writing this test.

Change-Id: I50353d0292fd37495bf73de3824c430912ef221d
2012-06-12 23:32:34 -07:00
Sameer Agarwal fa01519c47 Dogleg strategy and timing cleanups.
1. A new dogleg trust region strategy.
2. Consistent naming of all variables taking and reporting
   time. Also all are doubles now.
3. Enum to stringification routines.
4. bundle_adjuster.cc accepts max solver time and trust_region_strategy.
5. Time accounting is pushed into solver_impl.cc and there is now
   postprocessing time accounted for explicitly.
6. IterationCallback now has cumulative time.
7. LoggingCallback logs per iteration and cumulative time.
8. TrustRegionStrategy now allows for Invalid steps to be indicated
   explicitly.
9. Trust region minimizer actually terminates on max_solver_time.

Change-Id: I7e3b82c8beebc17b6b355ea46ddd280754a2d8b2
2012-06-11 22:16:02 -07:00
Sameer Agarwal d432f78389 Add explicit support for invalid steps
Change-Id: Ib4ff395a044bf053f81d06058d7fd13f5f4f54d7
2012-06-11 13:38:24 -07:00
Sameer Agarwal eb22b8b572 Remove skipped_pairs accounting.
Change-Id: I3b381f868d41a1653784a61d0207dae8cae06c4a
2012-06-11 11:50:43 -07:00
Sameer Agarwal 61305d901f Change iteration logging to VLOG(3)
Change-Id: I6847162447eb46381403b6ada063f03db4c9d257
2012-06-11 11:49:41 -07:00
Sameer Agarwal a579b7be62 system_test was taking too long to run.
SPARSE_NORMAL_CHOLESKY with CXSparse on the fairly small
bundle adjustment problem used in system_test is too expensive
to be useful as a test. It takes up too much memory and time
making the test fail on client computers < 4G of RAM.

These tests have been deleted.

Change-Id: Id015671536afd7013f5b7d19c39d64c2748884ad
2012-06-10 12:23:13 -07:00
Sameer Agarwal cb83b2801e Fix broken build.
Fix broken build and verbosity issues.

1. While cleaning up the last CL, I broke a macro.
2. cholmod_common_print was being called too often.

Change-Id: Ia76d8863c72f31b0c02977094b22035ceef835cf
2012-06-06 22:37:33 -07:00
Sameer Agarwal 7a3c43b847 Block oriented fill reducing orderings.
By virtue of the modeling layer in Ceres being block oriented,
all the matrices used by Ceres are also block oriented.
When doing sparse direct factorization of these matrices, the
fill-reducing ordering algorithms can either be run on the
block or the scalar form of these matrices. Running it on the
block form exposes more of the super-nodal structure of the
matrix to the Cholesky factorization routines. This leads to
substantial gains in factorization performance.

This changelist adds support for approximate minimium degree
orderings to be computed on the block structure of the
Schur complement matrix. This affects, SchurComplementSolver
and VisibilityBasedPreconditioner and SparseNormalCholesky
 when using SuiteSparse.

A bool, use_block_amd has been added to Solver::Options and
bundle_adjuster.cc has been updated to allow testing with it.

When combined with a multithreaded Schur elimination, speed ups
can be seen quite uniformly across the board. For some problems
this can be dramatic, reducing the factorization time from 70
seconds down to 17 seconds.

Change-Id: I15ebb0afcbc85ada032ec8d179ee3a2f7c8d3e46
2012-06-06 22:02:17 -07:00
Sameer Agarwal d28b3c86d3 Minor spacing issue fix.
Change-Id: I056354f0066e4912c2143798151e2c8e24b0f729
2012-06-05 21:50:31 -07:00
Sameer Agarwal 58ad13c05d BlockRandomAccessSparseMatrix::IntPairToLong suffers from integer
overflow.

Even though the return value of this function is a long int, the
computation happens with three ints, which causes an overflow before
the upgrade happens.

The fix is to upgrade the constant used int his computation to be a
long int, which causes the computation to be done in longs instead of
ints.

A test has been added to verify that the fix works.

Change-Id: Ibb0aef877125bb37ca28754cb07b8e1627fd1d5a
2012-06-05 18:06:00 -07:00