| .. default-domain:: cpp | 
 |  | 
 | .. cpp:namespace:: ceres | 
 |  | 
 | ==== | 
 | Why? | 
 | ==== | 
 | .. _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. | 
 |  | 
 |   - **Manifolds** 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:`Manifold` object. | 
 |  | 
 | * **Solver Choice** Depending on the size, sparsity structure, time & | 
 |   memory budgets, and solution quality requirements, 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`_, `LAPACK`_ or `CUDA`_) for dense problems, sparse | 
 |     Cholesky factorization (`SuiteSparse`_, `Accelerate`_, `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 or | 
 |   modern C++ threads based multithreading of the Jacobian evaluation | 
 |   and the linear solvers. | 
 |  | 
 | * **GPU Acceleration** If your system supports `CUDA`_ then Ceres | 
 |   Solver can use the Nvidia GPU on your system to speed up the solver. | 
 |  | 
 | * **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 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/ | 
 | .. _automatic: http://en.wikipedia.org/wiki/Automatic_differentiation | 
 | .. _numeric: http://en.wikipedia.org/wiki/Numerical_differentiation | 
 | .. _CUDA : https://developer.nvidia.com/cuda-toolkit | 
 | .. _Apple's Accelerate: https://developer.apple.com/documentation/accelerate/sparse_solvers |