87 lines
4.2 KiB
ReStructuredText
87 lines
4.2 KiB
ReStructuredText
========
|
|
Features
|
|
========
|
|
.. _chapter-features:
|
|
|
|
* **Code Quality** - Ceres Solver has been used in production at
|
|
Google for more than four years now. It is clean, extensively tested
|
|
and well documented code that is actively developed and supported.
|
|
|
|
* **Modeling API** - It is rarely the case that one starts with the
|
|
exact and complete formulation of the problem that one is trying to
|
|
solve. Ceres's modeling API has been designed so that the user can
|
|
easily build and modify the objective function, one term at a
|
|
time. And to do so without worrying about how the solver is going to
|
|
deal with the resulting changes in the sparsity/structure of the
|
|
underlying problem.
|
|
|
|
- **Derivatives** Supplying derivatives is perhaps the most tedious
|
|
and error prone part of using an optimization library. Ceres
|
|
ships with `automatic`_ and `numeric`_ differentiation. So you
|
|
never have to compute derivatives by hand (unless you really want
|
|
to). Not only this, Ceres allows you to mix automatic, numeric and
|
|
analytical derivatives in any combination that you want.
|
|
|
|
- **Robust Loss Functions** Most non-linear least squares problems
|
|
involve data. If there is data, there will be outliers. Ceres
|
|
allows the user to *shape* their residuals using a
|
|
:class:`LossFunction` to reduce the influence of outliers.
|
|
|
|
- **Local Parameterization** In many cases, some parameters lie on a
|
|
manifold other than Euclidean space, e.g., rotation matrices. In
|
|
such cases, the user can specify the geometry of the local tangent
|
|
space by specifying a :class:`LocalParameterization` object.
|
|
|
|
* **Solver Choice** Depending on the size, sparsity structure, time &
|
|
memory budgets, and solution quality requiremnts, different
|
|
optimization algorithms will suit different needs. To this end,
|
|
Ceres Solver comes with a variety of optimization algorithms:
|
|
|
|
- **Trust Region Solvers** - Ceres supports Levenberg-Marquardt,
|
|
Powell's Dogleg, and Subspace dogleg methods. The key
|
|
computational cost in all of these methods is the solution of a
|
|
linear system. To this end Ceres ships with a variety of linear
|
|
solvers - dense QR and dense Cholesky factorization (using
|
|
`Eigen`_ or `LAPACK`_) for dense problems, sparse Cholesky
|
|
factorization (`SuiteSparse`_, `CXSparse`_ or `Eigen`_) for large
|
|
sparse problems custom Schur complement based dense, sparse, and
|
|
iterative linear solvers for `bundle adjustment`_ problems.
|
|
|
|
- **Line Search Solvers** - When the problem size is so large that
|
|
storing and factoring the Jacobian is not feasible or a low
|
|
accuracy solution is required cheaply, Ceres offers a number of
|
|
line search based algorithms. This includes a number of variants
|
|
of Non-linear Conjugate Gradients, BFGS and LBFGS.
|
|
|
|
* **Speed** - Ceres Solver has been extensively optimized, with C++
|
|
templating, hand written linear algebra routines and OpenMP based
|
|
multithreading of the Jacobian evaluation and the linear solvers.
|
|
|
|
* **Solution Quality** Ceres is the `best performing`_ solver on the NIST
|
|
problem set used by Mondragon and Borchers for benchmarking
|
|
non-linear least squares solvers.
|
|
|
|
* **Covariance estimation** - Evaluate the sensitivity/uncertainty of
|
|
the solution by evaluating all or part of the covariance
|
|
matrix. Ceres is one of the few solvers that allows you to to do
|
|
this analysis at scale.
|
|
|
|
* **Community** Since its release as an open source software, Ceres
|
|
has developed an active developer community that contributes new
|
|
features, bug fixes and support.
|
|
|
|
* **Portability** - Runs on *Linux*, *Windows*, *Mac OS X*, *Android*
|
|
*and iOS*.
|
|
|
|
* **BSD Licensed** The BSD license offers the flexibility to ship your
|
|
application
|
|
|
|
.. _best performing: https://groups.google.com/forum/#!topic/ceres-solver/UcicgMPgbXw
|
|
.. _bundle adjustment: http://en.wikipedia.org/wiki/Bundle_adjustment
|
|
.. _SuiteSparse: http://www.cise.ufl.edu/research/sparse/SuiteSparse/
|
|
.. _Eigen: http://eigen.tuxfamily.org/
|
|
.. _LAPACK: http://www.netlib.org/lapack/
|
|
.. _CXSparse: https://www.cise.ufl.edu/research/sparse/CXSparse/
|
|
.. _automatic: http://en.wikipedia.org/wiki/Automatic_differentiation
|
|
.. _numeric: http://en.wikipedia.org/wiki/Numerical_differentiation
|