Commit Graph

654 Commits

Author SHA1 Message Date
Sameer Agarwal e9eb8a324e Fix when LineSearchMinimizer adds the IterationSummary to Solver::Summary
Previously, even when an iteration was successful, the LineSearchMinimizer
would only add the iteration summary to the Summary object if none
of the convergence tests were passed. This could cause iterations with
significant progress in the last iteration to be mis-reported.

The solution would be correct, but the actual cost would be misreported.

This change changes the order of these operations and ensures that
the iteration summary is added whenever the iteration itself is successful.

Thanks to Daniel Weindl for reporting this.

Change-Id: Iff10eccb49d50ad28127f44e149c17fa466db4ae
2017-03-19 00:38:01 -07:00
Alex Stewart 987d3b6b37 Fix ambiguous reference to WARNING when using miniglog.
- When compiling on Clang on OS X with MINIGLOG enabled, name lookup
  finds two ambiguous definitions of WARNING, one in the global
  namespace and one in the google namespace, both defined in the
  miniglog version of logging.h.

Change-Id: I6f1ad7d2750e1ed20ec1ba4574aab599086431df
2017-03-09 11:56:50 +00:00
Sameer Agarwal 1ebaff8a10 Two bug fixes.
1. Add schur_templates.cc to Android.mk
2. When detecting the Schur structure of the Jacobian,
   the check for whether linear solver being used is indeed
   of Schur type or not, should use the LinearSolver::Options
   struct created and populated by the preprocessor rather than
   depending on the value in the input Solver::Options. The reason
   is that the preprocessor may change the linear solver type
   depending on the lack of a Schur structure in the problem.

Change-Id: I6f018f6817c05d704409181c7b1e25155528ab84
2017-02-27 15:01:25 -08:00
Sameer Agarwal 784260d0b8 Fix missing ddd Schur specialization generation code
Change-Id: Ic808565844b0564b5fa5f94cbda69e9a18ac49ee
2017-02-27 11:53:22 -08:00
Sameer Agarwal 5f87f35cec Changes from William Rucklidge
Change-Id: Ia5d724edef947870fe13050a71aa1cba878352a8
2017-02-27 11:09:08 -08:00
Sameer Agarwal 1cfec3c666 Improvements to Schur template specializations
1. Refactor the python code that generates the template specializations
   to remove code duplication.
2. Improved the logic for template specialization selection where
   Eigen::Dynamic now serves as a wildcard.
3. Added schur_templates.h/cc which allows querying the set of available
   template specializations without instantiating a linear solver.
4. Added Solver::Summary::schur_structre_given and
   Solver::Summary::schur_structure_used and expose them in
   Solver::Summary::FullReport for better performance debugging.
5. Updated the templates with newer dates and some minor comments cleanup
   which lead to the the template specializations to be re-generated.

Change-Id: Iaf3c6f714353597899916c300465da01f151c3de
2017-02-23 14:52:59 -08:00
Sameer Agarwal 62a70bc74c Lint cleanup from William Rucklidge
Change-Id: I11ebf9bdb09cfd465a32a61e0a9a045ab650deac
2017-02-15 11:01:27 -08:00
Alex Stewart c1ebbfc79b Require Eigen >= 3.3 to define ScalarBinaryOpTraits in Jet.
- ScalarBinaryOpTraits was introduced in Eigen 3.3, and thus breaks
  compilation of Ceres for Eigen versions < 3.3.
- Reported as issue #252 by AustinDeric:
  https://github.com/ceres-solver/ceres-solver/issues/252

Change-Id: Ie9b7dace17709c348b18b297f2d5306b054ce4b0
2017-02-13 16:14:40 +00:00
Sameer Agarwal 5365ad8aa6 A hacky fix for the Eigen::FullPivLU changes.
Changes in Eigen's implementation for FullPivLU significantly
degraded the performance of the line search as reported by Weiguang.

We do not completely understand what is going on, as Eigen's changes
seem sane. So for now, this change explicitly works around the
changes made by Eigen to restore the performance of the line search.

Figuring out the underlying problem and fixing it remains an open
issue.

https://github.com/ceres-solver/ceres-solver/issues/248

Change-Id: I9993d73a09dc990ab567ce6bc447f16eac74abec
2017-02-12 12:04:30 -08:00
Chris Sweeney 9a195d91de Specify ScalarBinaryOpTraits for Jet types.
This commit extends the use of Jets with Eigen matrices and arrays
by enabling the use of binary operators (such as scalar addition,
multiplication, as well as matrix multiplication) when one Eigen
matrix/array is of type Jet and the other is a scalar type. This
should increase performance since Jet types have optimized
scalar-to-jet binary operations.

Change-Id: Ia756064845d845cefcf0abb16d366331d2824b52
2017-02-10 19:50:33 +00:00
Sameer Agarwal d05515b3eb Remove spurious conversion from doubles to Jets.
Binary operations between Jets and doubles are well defined
and should not require an explicit conversion to Jets to work.
This was an oversight earlier and lead to overzealous conversions
all over our in our example code.

Change-Id: I1799770818e136edfc0a5802d86037ce9aec4923
2017-02-10 11:36:58 -08:00
Sameer Agarwal 2dd907744d Ensure that partial evaluation of residuals triggers an error
ResidualBlock evaluation has logic to ensure that CostFunction
should always fill out the residual and jacobian arrays completely
by using a special value to pre-populate these arrays.

This works for CostFunctions with analytical Jacobians but not for
AutoDiffCostFunction and NumericDiffCostFunction Jacobians.

There is no way to fix this for NumericDiffCostFunctions without
introducing significant performance penalties but the residual
evaluation fails, which should be enough to catch such errors.

For AutoDiffCostFunction the way the Jets are default initialized
was sidestepping this check. So now, the Jet that is used to
capture the output residuals is now initialized with
kImpossibleValue, which will ensure that if the user forgets
to fill all output fields, it triggers an evaluation error.

This change required that ceres::internal::kImpossibleValue be moved
out of array_utils.h/cc to types.h.

Change-Id: I35bb0946cf0785a5d43c7b5459a2272848fb2a9b
2017-01-16 10:00:36 -08:00
Sameer Agarwal ba891a1025 Add an ifdef around the use of google::GLOG_WARNING
MSVC requires using google::GLOG_WARNING, but this breaks the build
inside google. So add a MSVC specific ifdef to guard against it.

Change-Id: I3509bb3fd2c01722a1c76545b57d2bf0224f6d6e
2017-01-05 11:27:49 -08:00
Alex Stewart 29888185a1 Make gflags a public dependency of Ceres if it and glog are found.
- Previously we were not listing gflags as a public dependency of Ceres
  if it and glog were found (and MINIGLOG was not being used). This
  does not reflect that if glog was compiled with gflags then it will
  #include gflags/gflags.h in glog/logging.h, thus making gflags a
  public dependency of anything linking against glog.
- On *nix OSs if glog/gflags are shared libraries this did not result
  in a link error when compiling Ceres as the gflags symbols were
  indirectly resolved.  However, on MSVC this is not the case, and this
  could result in unresolved gflags symbol link errors when compiling
  Ceres.
- Now we add gflags to the list of public Ceres dependencies if both
  glog and gflags are found (and MINIGLOG is not enabled).

Change-Id: I5ce6038fa816781cc81b378522068dc563d29c51
2016-11-20 19:44:46 +00:00
Alex Stewart 73341234cb Use google::GLOG_WARNING instead of WARNING in tests to support MSVC.
- GLOG_NO_ABBREVIATED_SEVERITIES is the default on Windows, in which
  case google::WARNING is not defined.
- Remove Ceres-specific redefinition of WARNING in mock-log.h fork
  in place of using non-abbreviated severity in the one place in
  levenberg_marquardt_strategy_test where ScopedMockLog is actually
  used.
- Remove unnecessary dependency of gradient_checking_cost_function_test
  on ScopedMockLog.

Change-Id: I9fb540f638037b6015fd264cfc618c9d60f5686c
2016-11-20 19:11:48 +00:00
Sameer Agarwal 185aacc71f Update gtest and gmock to a2b8a8e07628e5fd60644b6dd99c1b5e7d7f1f47
Change-Id: I1d7cfda65de173ceba156cf1f684f56f6c62840b
2016-11-20 10:57:24 -08:00
Hung Lun 1b1209824d Fix typo. indepdendent -> independent
Change-Id: I7f04f5e82a6e47e8d22c902744729f3f6d93dee8
2016-11-13 21:10:45 +08:00
Sameer Agarwal 88b827a0e7 Fix an exact equality test causing breakage in gradient_checker_test.
Also clang-format the file to fix some accumulated cruft.

Change-Id: Icf41e3f864a4fe925426477893602b50ff2131f4
2016-11-01 07:42:56 -07:00
Sameer Agarwal f21c17064b Add GradientProblemSolver::Options::parameter_tolerance.
Support for parameter tolerance was added to the line search
minimizer was added a while ago, and calling Solve on a
non-linear least squares problem supported it but for some reason
the GradientProblemSolver::Options struct was missing this
option even though the documentation suggested that it was present!

Thanks to Noah Snavely for reporting this bug.

Change-Id: I57cf4ab396bc822c19fa298529e113b89664a349
2016-11-01 12:56:19 +00:00
Je Hyeong Hong e892499e8d Relax the tolerance in QuaternionParameterizationTestHelper.
This commit relaxes the tolerance value for comparing between the actual
local matrix and the expected local matrix. Without this fix,
EigenQuaternionParameterization.ZeroTest could fail as the difference
exactly matches the value of std::numeric_limits<double>::epsilon().

Change-Id: Ic4d3f26c0acdf5f16fead80dfdc53df9e7dabbf9
2016-10-20 00:16:18 +01:00
Sameer Agarwal 7ed9e2fb7f Occured -> Occurred.
Thanks to Phillip Huebner for reporting this.

Change-Id: I9cddfbb373aeb496961d08e434fe661bff4abd29
2016-10-19 04:45:23 -07:00
Je Hyeong Hong b82f972796 Fix a test error in autodiff_test.cc.
Previously, the test for the projective camera model would fail as no
tolerance is set in line 144. To resolve this, this commit changes
assert_equal to assert_near.

Change-Id: I6cd3379083b1a10c7cd0a9cc83fd6962bb993cc9
2016-10-18 21:49:26 +01:00
David Gossow 0a4ccb7ee9 Relaxing Jacobian matching in Gradient Checker test.
Any result of an arithmetic operation on floating-point matrices
should never be checked for strict equality with some expected
value, due to limited floating point precision on different machines.
This fixes some occurences of exact checks in the gradient checker
unit test that were causing problems on some platforms.

Change-Id: I48e804c9c705dc485ce74ddfe51037d4957c8fcb
2016-10-10 14:40:14 +00:00
Je Hyeong Hong ee44fc91b5 Fix an Intel compiler error in covariance_impl.cc.
Intel C compiler strictly asks for parallel loops with collapse to be
perfectly nested. Otherwise, compiling Ceres with ICC will throw an
error at line 348 of covariance_impl.cc.

Change-Id: I1ecb68e89b7faf79e4153dfe6675c390d1780db4
2016-10-03 14:13:19 +01:00
Sameer Agarwal 9026d69d1c Allow SubsetParameterization to hold all parameters constant
1. SubsetParameterization can now be constructed such that all
parameters are constant. This is required for it be used as part
of a ProductParameterization to hold a part of parameter block
constant. For example, a parameter block consisting of a rotation
as a quaternion and a translation vector can now have a local
parameterization where the translation part is constant and the
quaternion part has a QuaternionParameterization associated with it.

2. The check for the tangent space of a parameterization being
positive dimensional. We were not doing this check up till now
and the user could accidentally create parameterizations like this
and create a problem for themselves. This will ensure that even
though one can construct a SubsetParameterization where all
parameters are constant, you cannot actually use it as a local
parameterization for an entire parameter block. Which is how
it was before, but the check was inside the SubsetParameterization
constructor.

3. Added more tests and refactored existing tests to be more
granular.

Change-Id: Ic0184a1f30e3bd8a416b02341781a9d98e855ff7
2016-09-22 20:33:53 -07:00
David Gossow 01e23e3d33 Removing duplicate include directive.
Change-Id: I729ae6501497746d1bb615cb893ad592e16ddf3f
2016-09-08 13:35:19 +00:00
Sameer Agarwal 83041ac84f Fix some compiler warnings.
Reported by Richard Trieu.

Change-Id: I202b7a7df09cc19c92582d276ccf171edf88a9fb
2016-09-02 19:10:35 -07:00
Sameer Agarwal 8c4623c63a Update ExpectArraysClose to use ExpectClose instead of EXPECT_NEAR
The documentation for ExpectArraysClose and its implementation
did not match.

This change makes the polynomial_test not fail on 64bit AMD builds.

Thanks to Phillip Huebner for reporting this.

Change-Id: I503f2d3317a28d5885a34f8bdbccd49d20ae9ba2
2016-09-03 02:01:10 +00:00
Sameer Agarwal 2fd39fcecb FindWithDefault returns by value rather than reference.
Returning by reference leads to lifetime issues with the default
value which may go out of scope by the time it is used.

Thanks to @Ardavel for reporting this, as this causes graph_test
to fail on VS2015x64.

https://github.com/ceres-solver/ceres-solver/issues/216

Change-Id: I596481219cfbf7622d49a6511ea29193b82c8ba3
2016-09-01 16:05:06 -07:00
David Gossow b102d53e1d Gradient checker multithreading bugfix.
This is a follow-up on c/7470. GradientCheckingCostFunction calls
callback_->SetGradientErrorDetected() in its Evaluate method,
which will run in multiple threads simultaneously when enabling
this option in the solver. Thus, the string append operation
inside that method has to be protected by a mutex.

Change-Id: I314ef1df2be52595370d9af05851bf6da39bb45e
2016-08-31 20:25:44 +00:00
Sameer Agarwal 79a28d1e49 Rename a confusingly named member of Solver::Options
Solver::Options::numeric_derivative_relative_step_size to
Solver::Options::gradient_check_numeric_derivative_relative_step_size

Change-Id: Ib89ae3f87e588d4aba2a75361770d2cec26f07aa
2016-08-31 07:47:29 -07:00
Alex Stewart edbd48ab50 Enable support for OpenMP in Clang if detected.
- Previously we disabled OpenMP if Clang was detected, as it did not
  support it.  However as of Clang 3.8 (and potentially Xcode 8) OpenMP
  is supported.

Change-Id: Ia39dac9fe746f1fc6310e08553f85f3c37349707
2016-08-31 08:25:11 +00:00
David Gossow ac3b8e8217 Gradient checking cleanup and local parameterization bugfix
Change the Ceres gradient checking API to make is useful for
unit testing, clean up code duplication and fix interaction between
gradient checking and local parameterizations.

There were two gradient checking implementations, one being used
when using the check_gradients flag in the Solver, the other
being a standalone class. The standalone version was restricted
to cost functions with fixed parameter sizes at compile time, which
is being lifted here. This enables it to be used inside the
GradientCheckingCostFunction as well.

In addition, this installs new hooks in the Solver to ensure
that Solve will fail if any incorrect gradients are detected. This
way, you can set the check_gradient flags to true and detect
errors in an automated way, instead of just printing error information
to the log. The error log is now also returned in the Solver summary
instead of being printed directly. The user can then decide what to
do with it. The existing hooks for user callbacks are used for
this purpose to keep the internal API changes minimal and non-invasive.

The last and biggest change is the way the the interaction between
local parameterizations and the gradient checker works. Before,
local parameterizations would be ignored by the checker. However,
if a cost function does not compute its Jacobian along the null
space of the local parameterization, this wil not have any effect
on the solver, but would result in a gradient checker error.
With this change, the Jacobians are multiplied by the Jacobians
of the respective local parameterization and thus being compared
in the tangent space only.

The typical use case for this are quaternion parameters, where
a cost function will typically assume that the quaternion is
always normalized, skipping the correct computation of the Jacobian
along the normal to save computation cost.

Change-Id: I5e1bb97b8a899436cea25101efe5011b0bb13282
2016-08-18 06:18:43 +00:00
Mike Vitus d4264ec10d Add a quaternion local parameterization for Eigen's quaternion element convention.
Change-Id: I7046e8b24805313c5fb6a767de581d0054fcdb83
2016-08-17 18:28:54 -07:00
Sameer Agarwal e1bcc6e0f5 Add additional logging for analyzing orderings
Change-Id: Ic68d2959db35254e2895f11294fb25de4d4b8a81
2016-08-02 10:12:04 -07:00
Nicolai Wojke 8ea86e1614 Fix: Copy minimizer option 'is_silent' to LinSearchDirection::Options
Change-Id: I23b4c3383cad30033c539ac93883d77c8dd4ba1a
2016-04-25 14:24:41 +02:00
Sameer Agarwal 21ab397dc5 Make some Jet comparisons exact.
Change-Id: Ia08c72f3b8779df96f5c0d5a954b2c0a1dd3a061
2016-04-24 21:13:00 -07:00
Sameer Agarwal 9665e09902 Fix step norm evaluation in LineSearchMinimizer
TrustRegionMinimizer evaluates the size of the step
taken in the ambient space, where as the LineSearchMinimizer
was using the norm in the tangent space. This change fixes
this discrepancy.

Change-Id: I9fef64cbb5622c9769c0413003cfb1dc6e89cfa3
2016-04-19 00:08:06 +00:00
Mike Vitus 0c63bd3efb Add floor and ceil functions to the Jet implementation.
Change-Id: I72ebfb0e9ade2964dbf3a014225ead345d5ae352
2016-04-15 10:47:22 -07:00
Keir Mierle 5512f58536 Only use collapse() directive with OpenMP 3.0 or higher
Change-Id: Icba544c0494763c57eb6dc61e98379312ca15972
2016-04-07 12:03:16 -07:00
Thomas Schneider d61e94da52 Add IsParameterBlockConstant to the ceres::Problem class.
Change-Id: I7d0e828e81324443209c17fa54dd1d37605e5bfe
2016-04-06 23:52:18 +02:00
Alex Stewart 77d94b3474 Fix install path for CeresConfig.cmake to be architecture-aware.
- Previously we were auto-detecting a "64" suffix for the install path
  for the Ceres library on non-Debian/Arch Linux distributions, but
  we were installing CeresConfig.cmake to an architecture independent
  location.
- We now install CeresConfig.cmake to lib${LIB_SUFFIX}/cmake/Ceres.
- Also make LIB_SUFFIX visible to the user in the CMake GUI s/t they can
  easily override the auto-detected value if desired.
- Reported by jpgr87@gmail.com as Issue #194.

Change-Id: If126260d7af685779487c01220ae178ac31f7aea
2016-03-16 21:20:31 +00:00
Keir Mierle f4ba28d09d Fix double conversion to degrees in rotation_test
Change-Id: I16b6d210cdab94340c001b322916c5b1a3b6a35f
2016-03-16 11:38:05 -07:00
Keir Mierle 0149ce0e0e Fix rotation_test IsClose() and related tests
Change-Id: I0ff91e2931615babf1dcc9483fac7f4a2fb13726
2016-03-16 11:09:53 -07:00
Sameer Agarwal 2c178ec35f Add more documentation.
Add documentation to the TrustRegionMinimizer and
TrustRegionStepEvaluator.

Change-Id: I3651e41ff37955a0b7044910403630af1a855071
2016-03-06 21:13:42 -08:00
Sameer Agarwal 2ee3e06064 Loosen an exact equality in local_parameterization_test
The norm comparison in QuaternionParameterizationHelper is exact
but that leads to numerical precision problems and test failures
as reported by Nicu Stiurca.

https://github.com/ceres-solver/ceres-solver/issues/198

Change-Id: I45f42f0373770408ddeee0b4c9d162e619f8d445
2016-03-04 22:12:18 -08:00
Simon Rutishauser 7d670209a2 Fix error message returned when using SUITE_SPARSE_QR in covariance estimation
on a ceres built without SuiteSparse support.

This is only a minor issue, up until now this case would have been handled by
the "default" case of the switch

Change-Id: Ib4568eb827dbf0e8e8d618a5bc8cd379a3c42c42
2016-02-16 11:53:45 +01:00
Sameer Agarwal 982327062e Initialize inner_iterations_were_useful_ correctly.
This variable should be initialized before the decision to
perform inner iterations are performed.

Change-Id: Ic80e2d5284ecc67eaed1859be009b1a4d18bf76b
2016-02-04 11:50:20 -08:00
Sameer Agarwal 46ad4699f4 A complete refactoring of TrustRegionMinimizer.
1. Break up the monolithic loop in TrustRegionMinimizer::Minimize
   into a number of more easily described and analyzed subfunctions.
2. Break out the logic for evaluating the quality of a Trust Region
   step into its own object - TrustRegionStepEvaluator.

Change-Id: I08580ecac074cfd74c096cb8e4880cbda3d48296
2016-02-04 10:05:12 -08:00
Sameer Agarwal dec43ae5e0 Add an implementation for GradientProblemSolver::Options::IsValid
Thanks for Francesco Callari for reporting this.

Change-Id: I2b2f4e0e098fbdc914dc7770db1164884ac50e24
2016-02-03 07:24:05 -08:00