.. _chapter-version-history:

===============
Version History
===============

1.7.0
=====

New Features
------------

#. Sparse and dense covariance estimation.
#. A new Wolfe line search. (Alex Stewart)
#. ``BFGS`` line search direction. (Alex Stewart)
#. C API
#. Speeded up the use of loss functions > 17x.
#. Use of Inner iterations can now be adaptively stopped. Iteration
   and runtime statistics for inner iterations are not reported in
   ``Solver::Summary`` and ``Solver::Summary::FullReport``.
#. Add BlockRandomAccessCRSMatrix.
#. Speeded up automatic differentiation by 7\%.
#. Bundle adjustment example from libmv/Blender (Sergey Sharybin)
#. Add the ability to turn shared library compilation on and off
#. No more dependence on Protocol Buffers.
#. Incomplete LQ factorization.
#. Ability to write trust region problems to disk.
#. Add sinh, cosh, tanh and tan functions to automatic differentiation
   (Johannes Schönberger)

Bug Fixes
---------

#. Add documentation for minimizer progress output.
#. Lint and other cleanups (William Rucklidge and James Roseborough)
#. Collections port fix for MSC 2008 (Sergey Sharybin)
#. Various corrections and cleanups in the documentation.
#. Change the path where CeresConfig.cmake is installed (Pablo
   Speciale)
#. Minor erros in documentation (Pablo Speciale)
#. Updated depend.cmake to follow CMake IF convention. (Joydeep
   Biswas)
#. Stablize the schur ordering algorithm.
#. Update license header in split.h.
#. Enabling -O4 (link-time optimization) only if compiler/linker
   support it. (Alex Stewart)
#. Consistent glog path across files.
#. ceres-solver.spec: Use cleaner, more conventional Release string
   (Taylor Braun-Jones)
#. Fix compile bug on RHEL6 due to missing header (Taylor Braun-Jones)
#. CMake file is less verbose.
#. Use the latest upstream version of google-test and gmock.
#. Rationalize some of the variable names in ``Solver::Options``.
#. Improve Summary::FullReport when line search is used.
#. Expose line search parameters in ``Solver::Options``.
#. Fix update of L-BFGS history buffers after they become full. (Alex
   Stewart)
#. Fix configuration error on systems without SuiteSparse installed
   (Sergey Sharybin)
#. Enforce the read call returns correct value in ``curve_fitting_c.c``
   (Arnaud Gelas)
#. Fix DynamicAutoDiffCostFunction (Richard Stebbing)
#. Fix Problem::RemoveParameterBlock documentation (Johannes
   Schönberger)
#. Fix a logging bug in parameter_block.h
#. Refactor the preconditioner class structure.
#. Fix an uninitialized variable warning when building with ``GCC``.
#. Fix a reallocation bug in
   ``CreateJacobianBlockSparsityTranspose``. (Yuliy Schwartzburg)
#. Add a define for O_BINARY.


1.6.0
=====

New Features
------------

#. Major Performance improvements.

   a. Schur type solvers (``SPARSE_SCHUR``, ``DENSE_SCHUR``,
      ``ITERATIVE_SCHUR``) are significantly faster due to custom BLAS
      routines and fewer heap allocations.

   b. ``SPARSE_SCHUR`` when used with ``CX_SPARSE`` now uses a block
      AMD for much improved factorization performance.

   c. The jacobian matrix is pre-ordered so that
      ``SPARSE_NORMAL_CHOLESKY`` and ``SPARSE_SCHUR`` do not have to
      make copies inside ``CHOLMOD``.

   d. Faster autodiff by replacing division by multplication by inverse.

   e. When compiled without threads, the schur eliminator does not pay
      the penalty for locking and unlocking mutexes.

#. Users can now use ``linear_solver_ordering`` to affect the
   fill-reducing ordering used by ``SUITE_SPARSE`` for
   ``SPARSE_NORMAL_CHOLESKY``.

#. ``Problem`` can now report the set of parameter blocks it knows about.

#. ``TrustRegionMinimizer`` uses the evaluator to compute the gradient
   instead of a matrix vector multiply.

#. On ``Mac OS``, whole program optimization is enabled.

#. Users can now use automatic differentiation to define new
   ``LocalParameterization`` objects. (Sergey Sharybin)

#. Enable larger tuple sizes for Visual Studio 2012. (Petter Strandmark)


Bug Fixes
---------

#. Update the documentation for ``CostFunction``.
#. Fixed a typo in the documentation. (Pablo Speciale)
#. Fix a typo in suitesparse.cc.
#. Bugfix in ``NumericDiffCostFunction``. (Nicolas Brodu)
#. Death to BlockSparseMatrixBase.
#. Change Minimizer::Options::min_trust_region_radius to double.
#. Update to compile with stricter gcc checks. (Joydeep Biswas)
#. Do not modify cached CMAKE_CXX_FLAGS_RELEASE. (Sergey Sharybin)
#. ``<iterator>`` needed for back_insert_iterator. (Petter Strandmark)
#. Lint cleanup. (William Rucklidge)
#. Documentation corrections. (Pablo Speciale)


1.5.0
=====

Backward Incompatible API Changes
---------------------------------

#. Added ``Problem::Evaluate``. Now you can evaluate a problem or any
   part of it without calling the solver.

   In light of this the following settings have been deprecated and
   removed from the API.

   - ``Solver::Options::return_initial_residuals``
   - ``Solver::Options::return_initial_gradient``
   - ``Solver::Options::return_initial_jacobian``
   - ``Solver::Options::return_final_residuals``
   - ``Solver::Options::return_final_gradient``
   - ``Solver::Options::return_final_jacobian``

   Instead we recommend using something like this.

   .. code-block:: c++

     Problem problem;
     // Build problem

     vector<double> initial_residuals;
     problem.Evaluate(Problem::EvaluateOptions(),
                      NULL, /* No cost */
                      &initial_residuals,
                      NULL, /* No gradient */
                      NULL  /* No jacobian */ );

     Solver::Options options;
     Solver::Summary summary;
     Solver::Solve(options, &problem, &summary);

     vector<double> final_residuals;
     problem.Evaluate(Problem::EvaluateOptions(),
                      NULL, /* No cost */
                      &final_residuals,
                      NULL, /* No gradient */
                      NULL  /* No jacobian */ );


New Features
------------
#. Problem now supports removal of ParameterBlocks and
   ResidualBlocks. There is a space/time tradeoff in doing this which
   is controlled by
   ``Problem::Options::enable_fast_parameter_block_removal``.

#. Ceres now supports Line search based optimization algorithms in
   addition to trust region algorithms. Currently there is support for
   gradient descent, non-linear conjugate gradient and LBFGS search
   directions.

#. Added ``Problem::Evaluate``. Now you can evaluate a problem or any
   part of it without calling the solver. In light of this the
   following settings have been deprecated and removed from the API.

   - ``Solver::Options::return_initial_residuals``
   - ``Solver::Options::return_initial_gradient``
   - ``Solver::Options::return_initial_jacobian``
   - ``Solver::Options::return_final_residuals``
   - ``Solver::Options::return_final_gradient``
   - ``Solver::Options::return_final_jacobian``

#. New, much improved HTML documentation using Sphinx.

#. Changed ``NumericDiffCostFunction`` to take functors like
   ``AutoDiffCostFunction``.

#. Added support for mixing automatic, analytic and numeric
   differentiation. This is done by adding ``CostFunctionToFunctor``
   and ``NumericDiffFunctor`` objects to the API.

#. Sped up the robust loss function correction logic when residual is
   one dimensional.

#. Sped up ``DenseQRSolver`` by changing the way dense jacobians are
   stored. This is a 200-500% improvement in linear solver performance
   depending on the size of the problem.

#. ``DENSE_SCHUR`` now supports multi-threading.

#. Greatly expanded ``Summary::FullReport``:

   - Report the ordering used by the ``LinearSolver``.
   - Report the ordering used by the inner iterations.
   - Execution timing breakdown into evaluations and linear solves.
   - Effective size of the problem solved by the solver, which now
     accounts for the size of the tangent space when using a
     ``LocalParameterization``.

#. Ceres when run at the ``VLOG`` level 3 or higher will report
   detailed timing information about its internals.

#. Remove extraneous initial and final residual evaluations. This
   speeds up the solver a bit.

#. Automatic differenatiation with a dynamic number of parameter
   blocks. (Based on an idea by Thad Hughes).

#. Sped up problem construction and destruction.

#. Added matrix adapters to ``rotation.h`` so that the rotation matrix
   routines can work with row and column major matrices. (Markus Moll)

#. ``SCHUR_JACOBI`` can now be used without ``SuiteSparse``.

#. A ``.spec`` file for producing RPMs. (Taylor Braun-Jones)

#. ``CMake`` can now build the sphinx documentation (Pablo Speciale)

#. Add support for creating a CMake config file during build to make
   embedding Ceres in other CMake-using projects easier. (Pablo
   Speciale).

#. Better error reporting in ``Problem`` for missing parameter blocks.

#. A more flexible ``Android.mk`` and a more modular build. If binary
   size and/or compile time is a concern, larger parts of the solver
   can be disabled at compile time.

Bug Fixes
---------
#. Compilation fixes for MSVC2010 (Sergey Sharybin)

#. Fixed "deprecated conversion from string constant to char*"
   warnings. (Pablo Speciale)

#. Correctly propagate ifdefs when building without Schur eliminator
   template specializations.

#. Correct handling of ``LIB_SUFFIX`` on Linux. (Yuliy Schwartzburg).

#. Code and signature cleanup in ``rotation.h``.

#. Make examples independent of internal code.

#. Disable unused member in ``gtest`` which results in build error on
   OS X with latest Xcode. (Taylor Braun-Jones)

#. Pass the correct flags to the linker when using
   ``pthreads``. (Taylor Braun-Jones)

#. Only use ``cmake28`` macro when building on RHEL6. (Taylor
   Braun-Jones)

#. Remove ``-Wno-return-type-c-linkage`` when compiling with
   GCC. (Taylor Braun-Jones)

#. Fix ``No previous prototype`` warnings. (Sergey Sharybin)

#. MinGW build fixes. (Sergey Sharybin)

#. Lots of minor code and lint fixes. (William Rucklidge)

#. Fixed a bug in ``solver_impl.cc`` residual evaluation. (Markus
   Moll)

#. Fixed varidic evaluation bug in ``AutoDiff``.

#. Fixed ``SolverImpl`` tests.

#. Fixed a bug in ``DenseSparseMatrix::ToDenseMatrix()``.

#. Fixed an initialization bug in ``ProgramEvaluator``.

#. Fixes to Android.mk paths (Carlos Hernandez)

#. Modify ``nist.cc`` to compute accuracy based on ground truth
   solution rather than the ground truth function value.

#. Fixed a memory leak in ``cxsparse.cc``. (Alexander Mordvintsev).

#. Fixed the install directory for libraries by correctly handling
   ``LIB_SUFFIX``. (Taylor Braun-Jones)

1.4.0
=====

Backward Incompatible API Changes
---------------------------------

The new ordering API breaks existing code. Here the common case fixes.

**Before**

.. code-block:: c++

 options.linear_solver_type = ceres::DENSE_SCHUR
 options.ordering_type = ceres::SCHUR

**After**


.. code-block:: c++

  options.linear_solver_type = ceres::DENSE_SCHUR


**Before**

.. code-block:: c++

 options.linear_solver_type = ceres::DENSE_SCHUR;
 options.ordering_type = ceres::USER;
 for (int i = 0; i < num_points; ++i) {
   options.ordering.push_back(my_points[i])
 }
 for (int i = 0; i < num_cameras; ++i) {
   options.ordering.push_back(my_cameras[i])
 }
 options.num_eliminate_blocks = num_points;


**After**

.. code-block:: c++

 options.linear_solver_type = ceres::DENSE_SCHUR;
 options.ordering = new ceres::ParameterBlockOrdering;
 for (int i = 0; i < num_points; ++i) {
   options.linear_solver_ordering->AddElementToGroup(my_points[i], 0);
 }
 for (int i = 0; i < num_cameras; ++i) {
   options.linear_solver_ordering->AddElementToGroup(my_cameras[i], 1);
 }


New Features
------------

#. A new richer, more expressive and consistent API for ordering
   parameter blocks.

#. A non-linear generalization of Ruhe & Wedin's Algorithm II. This
   allows the user to use variable projection on separable and
   non-separable non-linear least squares problems. With
   multithreading, this results in significant improvements to the
   convergence behavior of the solver at a small increase in run time.

#. An image denoising example using fields of experts. (Petter
   Strandmark)

#. Defines for Ceres version and ABI version.

#. Higher precision timer code where available. (Petter Strandmark)

#. Example Makefile for users of Ceres.

#. IterationSummary now informs the user when the step is a
   non-monotonic step.

#. Fewer memory allocations when using ``DenseQRSolver``.

#. GradientChecker for testing CostFunctions (William Rucklidge)

#. Add support for cost functions with 10 parameter blocks in
   ``Problem``. (Fisher)

#. Add support for 10 parameter blocks in ``AutoDiffCostFunction``.


Bug Fixes
---------

#. static cast to force Eigen::Index to long conversion

#. Change LOG(ERROR) to LOG(WARNING) in ``schur_complement_solver.cc``.

#. Remove verbose logging from ``DenseQRSolve``.

#. Fix the Android NDK build.

#. Better handling of empty and constant Problems.

#. Remove an internal header that was leaking into the public API.

#. Memory leak in ``trust_region_minimizer.cc``

#. Schur ordering was operating on the wrong object (Ricardo Martin)

#. MSVC fixes (Petter Strandmark)

#. Various fixes to ``nist.cc`` (Markus Moll)

#. Fixed a jacobian scaling bug.

#. Numerically robust computation of ``model_cost_change``.

#. Signed comparison compiler warning fixes (Ricardo Martin)

#. Various compiler warning fixes all over.

#. Inclusion guard fixes (Petter Strandmark)

#. Segfault in test code (Sergey Popov)

#. Replaced ``EXPECT/ASSERT_DEATH`` with the more portable
   ``EXPECT_DEATH_IF_SUPPORTED`` macros.

#. Fixed the camera projection model in Ceres' implementation of
   Snavely's camera model. (Ricardo Martin)


1.3.0
=====

New Features
------------

#. Android Port (Scott Ettinger also contributed to the port)

#. Windows port. (Changchang Wu and Pierre Moulon also contributed to the port)

#. New subspace Dogleg Solver. (Markus Moll)

#. Trust region algorithm now supports the option of non-monotonic steps.

#. New loss functions ``ArcTanLossFunction``, ``TolerantLossFunction``
   and ``ComposedLossFunction``. (James Roseborough).

#. New ``DENSE_NORMAL_CHOLESKY`` linear solver, which uses Eigen's
   LDLT factorization on the normal equations.

#. Cached symbolic factorization when using ``CXSparse``.
   (Petter Strandark)

#. New example ``nist.cc`` and data from the NIST non-linear
   regression test suite. (Thanks to Douglas Bates for suggesting this.)

#. The traditional Dogleg solver now uses an elliptical trust
   region (Markus Moll)

#. Support for returning initial and final gradients & Jacobians.

#. Gradient computation support in the evaluators, with an eye
   towards developing first order/gradient based solvers.

#. A better way to compute ``Solver::Summary::fixed_cost``. (Markus Moll)

#. ``CMake`` support for building documentation, separate examples,
   installing and uninstalling the library and Gerrit hooks (Arnaud
   Gelas)

#. ``SuiteSparse4`` support (Markus Moll)

#. Support for building Ceres without ``TR1`` (This leads to
   slightly slower ``DENSE_SCHUR`` and ``SPARSE_SCHUR`` solvers).

#. ``BALProblem`` can now write a problem back to disk.

#. ``bundle_adjuster`` now allows the user to normalize and perturb the
   problem before solving.

#. Solver progress logging to file.

#. Added ``Program::ToString`` and ``ParameterBlock::ToString`` to
   help with debugging.

#. Ability to build Ceres as a shared library (MacOS and Linux only),
   associated versioning and build release script changes.

#. Portable floating point classification API.


Bug Fixes
---------

#. Fix how invalid step evaluations are handled.

#. Change the slop handling around zero for model cost changes to use
   relative tolerances rather than absolute tolerances.

#. Fix an inadvertant integer to bool conversion. (Petter Strandmark)

#. Do not link to ``libgomp`` when building on
   windows. (Petter Strandmark)

#. Include ``gflags.h`` in ``test_utils.cc``. (Petter
   Strandmark)

#. Use standard random number generation routines. (Petter Strandmark)

#. ``TrustRegionMinimizer`` does not implicitly negate the
   steps that it takes. (Markus Moll)

#. Diagonal scaling allows for equal upper and lower bounds. (Markus Moll)

#. TrustRegionStrategy does not misuse LinearSolver:Summary anymore.

#. Fix Eigen3 Row/Column Major storage issue. (Lena Gieseke)

#. QuaternionToAngleAxis now guarantees an angle in $[-\pi, \pi]$. (Guoxuan Zhang)

#. Added a workaround for a compiler bug in the Android NDK to the
   Schur eliminator.

#. The sparse linear algebra library is only logged in
   Summary::FullReport if it is used.

#. Rename the macro ``CERES_DONT_HAVE_PROTOCOL_BUFFERS``
   to ``CERES_NO_PROTOCOL_BUFFERS`` for consistency.

#. Fix how static structure detection for the Schur eliminator logs
   its results.

#. Correct example code in the documentation. (Petter Strandmark)

#. Fix ``fpclassify.h`` to work with the Android NDK and STLport.

#. Fix a memory leak in the ``levenber_marquardt_strategy_test.cc``

#. Fix an early return bug in the Dogleg solver. (Markus Moll)

#. Zero initialize Jets.
#. Moved ``internal/ceres/mock_log.h`` to ``internal/ceres/gmock/mock-log.h``

#. Unified file path handling in tests.

#. ``data_fitting.cc`` includes ``gflags``

#. Renamed Ceres' Mutex class and associated macros to avoid
   namespace conflicts.

#. Close the BAL problem file after reading it (Markus Moll)

#. Fix IsInfinite on Jets.

#. Drop alignment requirements for Jets.

#. Fixed Jet to integer comparison. (Keith Leung)

#. Fix use of uninitialized arrays. (Sebastian Koch & Markus Moll)

#. Conditionally compile gflag dependencies.(Casey Goodlett)

#. Add ``data_fitting.cc`` to the examples ``CMake`` file.


1.2.3
=====

Bug Fixes
---------

#. ``suitesparse_test`` is enabled even when ``-DSUITESPARSE=OFF``.

#. ``FixedArray`` internal struct did not respect ``Eigen``
   alignment requirements (Koichi Akabe & Stephan Kassemeyer).

#. Fixed ``quadratic.cc`` documentation and code mismatch
   (Nick Lewycky).

1.2.2
=====

Bug Fixes
---------

#. Fix constant parameter blocks, and other minor fixes (Markus Moll)

#. Fix alignment issues when combining ``Jet`` and
   ``FixedArray`` in automatic differeniation.

#. Remove obsolete ``build_defs`` file.

1.2.1
=====

New Features
------------

#. Powell's Dogleg solver

#. Documentation now has a brief overview of Trust Region methods and
   how the Levenberg-Marquardt and Dogleg methods work.

Bug Fixes
---------

#. Destructor for ``TrustRegionStrategy`` was not virtual (Markus Moll)

#. Invalid ``DCHECK`` in ``suitesparse.cc`` (Markus Moll)

#. Iteration callbacks were not properly invoked (Luis Alberto Zarrabeiti)

#. Logging level changes in ConjugateGradientsSolver

#. VisibilityBasedPreconditioner setup does not account for skipped camera pairs. This was debugging code.

#. Enable SSE support on MacOS

#. ``system_test`` was taking too long and too much memory (Koichi Akabe)

1.2.0
=====

New Features
------------

#. ``CXSparse`` support.

#. Block oriented fill reducing orderings. This reduces the
   factorization time for sparse ``CHOLMOD`` significantly.

#. New Trust region loop with support for multiple trust region step
   strategies. Currently only Levenberg-Marquardt is supported, but
   this refactoring opens the door for Dog-leg, Stiehaug and others.

#. ``CMake`` file restructuring.  Builds in ``Release`` mode by
   default, and now has platform specific tuning flags.

#. Re-organized documentation. No new content, but better
   organization.


Bug Fixes
---------

#. Fixed integer overflow bug in ``block_random_access_sparse_matrix.cc``.

#. Renamed some macros to prevent name conflicts.

#. Fixed incorrent input to ``StateUpdatingCallback``.

#. Fixes to AutoDiff tests.

#. Various internal cleanups.


1.1.1
=====

Bug Fixes
---------

#. Fix a bug in the handling of constant blocks. (Louis Simard)

#. Add an optional lower bound to the Levenberg-Marquardt regularizer
   to prevent oscillating between well and ill posed linear problems.

#. Some internal refactoring and test fixes.

1.1.0
=====

New Features
------------

#. New iterative linear solver for general sparse problems - ``CGNR``
   and a block Jacobi preconditioner for it.

#. Changed the semantics of how ``SuiteSparse`` dependencies are
   checked and used. Now ``SuiteSparse`` is built by default, only if
   all of its dependencies are present.

#. Automatic differentiation now supports dynamic number of residuals.

#. Support for writing the linear least squares problems to disk in
   text format so that they can loaded into ``MATLAB``.

#. Linear solver results are now checked for nan and infinities.

#. Added ``.gitignore`` file.

#. A better more robust build system.


Bug Fixes
---------

#. Fixed a strict weak ordering bug in the schur ordering.

#. Grammar and typos in the documents and code comments.

#. Fixed tests which depended on exact equality between floating point values.

1.0.0
=====

Initial Release. Nathan Wiegand contributed to the Mac OSX port.
