.. default-domain:: cpp

.. highlight:: c++

.. cpp:namespace:: ceres


.. _chapter-version-history:

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

2.1.0
=====

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

#. Support for CUDA based dense solvers - ``DENSE_QR``,
   ``DENSE_NORMAL_CHOLESKY`` & ``DENSE_SCHUR`` (Joydeep Biswas, Sameer
   Agarwal)

#. :class:`Manifold` is the new
   :class:`LocalParameterization`. Version 2.1 is the transition
   release where users can use both :class:`LocalParameterization` as
   well as :class:`Manifold` objects as they transition from the
   former to the latter. :class:`LocalParameterization` will be
   removed in version 2.2. There should be no numerical change to the
   results as a result of this change. (Sameer Agarwal, Johannes Beck,
   Sergiu Deitsch)

#. A number of changes to :class:`Jet` s (Sergiu Deitsch)

   * :class:`Jet` gained support for, ``copysign``, ``fma`` (fused
     multiply-add), ``midpoint`` (C++20 and above), ``lerp`` (C++20
     and above), 3-argument ``hypot`` (C++17 and above), ``log10``,
     ``log1p``, ``exp1m``, ``norm`` (squared :math:`L^2` norm).

   * Quiet floating-point comparison: ``isless``, ``isgreater``,
     ``islessgreater``, ``islessequal``, ``isgreaterequal``,
     ``isunordered``, ``signbit``, ``fdim``

   * Categorization and comparison operations are applied exclusively
     and consistently to the scalar part of a Jet now: ``isnan``,
     ``isinf``, ``isnormal``, ``isfinite``, ``fpclassify`` (new),
     ``fmin``, ``fmax``

   * It is now possible to safely compare a :class:`Jet` against a scalar
     (or literal) without constructing a :class:`Jet` first (even if it's
     nested):

     .. code-block:: c++

        Jet<Jet<Jet<T, N>, M>, O> x;
        if (x == 2) { } // equivalent to x.a.a.a == 2


     This enables interaction with various arithmetic functions that
     expect a scalar like instance, such as ``boost::math::pow<-N>``
     for reciprocal computation.

#. Add :class:`NumericDiffFirstOrderFunction` (Sameer Agarwal)


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

#. :class:`LocalParameterization` is deprecated. It will be removed in
   version 2.2. Use :class:`Manifold` instead.
#. Classification functions like ``IsFinite`` are deprecated. Use the
   ``C++11`` functions (``isfinite``, ``isnan`` etc) going
   forward. However to maintain consistent behaviour with comparison
   operators, these functions only inspect the scalar part of the
   :class:`Jet`.

Bug Fixes & Minor Changes
-------------------------

#. Updated included gtest version to 1.11.0. This should fix some
   ``C++20`` compilation problems. (Sameer Agarwal).
#. Workaround ``MSVC`` ``STL`` deficiency in ``C++17`` mode (Sergiu
   Deitsch)
#. Fix ``Jet`` test failures on ``ARMv8`` with recent ``Xcode``
   (Sergiu Deitsch)
#. Fix unused arguments of ``Make1stOrderPerturbation`` (Dmitriy
   Korchemkin)
#. Fix ``SuiteSparse`` path and version reporting (Sergiu Deitsch)
#. Enable `GitHub` workflows and deprecate ``TravisCI`` (Sergiu
   Deitsch)
#. Add missing includes (Sergiu Deitsch, Sameer Agarwal)
#. Fix path for ``cuda-memcheck`` tests (Joydeep Biswas)
#. ClangFormat cleanup (Sameer Agarwal)
#. Set ``CMP0057`` policy for ``IN_LIST`` operator in
   ``FindSuiteSparse.cmake`` (Brent Yi)
#. Do not define unusable import targets (Sergiu Deitsch)
#. Fix Ubuntu 18.04 shared library build (Sergiu Deitsch)
#. Force ``C++`` linker when building the ``C`` API (Sergiu Deitsch)
#. Modernize the code to be inline with ``C++14`` (Sergiu Deitsch,
   Sameer Agarwal)
#. Lots of fixes to make Ceres compile out of the box on Windows
   (Sergiu Deitsch)
#. Standardize path handling using ``GNUImstallDirs`` (Sergiu Deitsch)
#. Add final specifier to classes to help the compiler with
   devirtualization (Sameer Agarwal)
#. LOTs of clean & modernization of the CMake build files (Sergiu
   Deitsch & Alex Stewart)
#. Simplification to the symbol export logic (Sergiu Deitsch)
#. Add cmake option ``ENABLE_BITCODE`` for iOS builds (John Harrison)
#. Add const accessor for functor wrapped by auto/numeric-diff objects
   (Alex Stewart)
#. Cleanup & refactor ``jet_test.cc``. (Sameer Agarwal)
#. Fix docs of supported sparse backends for mixed precision solvers
   (Alex Stewart)
#. Fix C++20 compilation (Sergiu Deitsch)
#. Add an example for ``BiCubicInterpolator`` (Dmitriy Korcchemkin)
#. Add a section to the documentation on implicit and inverse function
   theorems (Sameer Agarwal)
#. Add a note about Trigg's correction (Sameer Agarwal)
#. Fix the docs for ``Problem::RemoveResidualBlock`` &
   ``Problem::RemoveParameterBlock`` (Sameer Agarwal)
#. Fix an incorrect check in ``reorder_program.cc`` (William Gandler)
#. Add ``function_tolerance`` based convergence testing to ``TinySolver``
   (Sameer Agarwal).
#. Fix a number of typos in ``rotation.h`` (@yiping)
#. Fix a typo in ``interfacing_with_autodiff.rst`` (@tangobravo)
#. Fix a matrix sizing bug in covariance_impl.cc (William Gandler)
#. Fix a bug in ``system_test.cc`` (William Gandler)
#. Fix the Jacobian computation in ``trust_region_minimizer_test.cc``
   (William Gandler)
#. Fix a bug in ``local_parameterization_test.cc`` (William Gandler)
#. Add accessors to ``GradientProblem`` (Sameer Agarwal)
#. Refactor ``small_blas_gemm_benchmark`` (Ahmed Taei)
#. Refactor ``small_blas_test`` (Ahmed Taei)
#. Fix dependency check for building documentation (Sumit Dey)
#. Fix an errant double link in the docs (Timon Knigge)
#. Fix a typo in the version history (Noah Snavely)
#. Fix typo in LossFunctionWrapper sample code (Dmitriy Korchemkin)
#. Add fmax/fmin overloads for scalars (Alex Karatarakis)
#. Introduce benchmarks for ``Jet`` operations (Alexander Karatarakis)
#. Fix typos in documentation and fix the documentation for
   ``IterationSummary`` (Alexander Karatarakis)
#. Do not check MaxNumThreadsAvailable if the thread number is set
   to 1. (Fuhao Shi)
#. Add a macro ``CERES_GET_FLAG``. (Sameer Agarwal)
#. Reduce log spam in ``covariance_impl.cc`` (Daniel Henell)
#. Fix FindTBB version detection with TBB >= 2021.1.1 (Alex Stewart)
#. Fix Eigen3_VERSION (Florian Berchtold)
#. Allow Unity Build (Tobias Schluter)
#. Make miniglog's InitGoogleLogging argument const (Tobias Schluter)
#. Use portable expression for constant 2/sqrt(pi) (Tobias Schluter)
#. Fix a number of compile errors related (Austin Schuch)

   * ``format not a string literal``
   * ``-Wno-maybe-uninitialized error``
   * ``nonnull arg compared to NULL``
   * ``-Wno-format-nonliteral``
   * ``-Wmissing-field-initializers``
   * ``-Werror``

#. Fix ``cc_binary`` includes so examples build as an external repo
   (Austin Schuh)
#. Fix an explicit double in TinySolver (Bogdan Burlacu)
#. Fix unit quaternion rotation (Mykyta Kozlov)


2.0.0
=====

New Features
------------
#. Ceres Solver now requires a C++14 compatible compiler, Eigen
   version >= 3.3 & CMake version >= 3.5, XCode version >= 11.2 (Sameer
   Agarwal, Alex Stewart & Keir Mierle)
#. C++ threading based multi-threading support. (Mike Vitus)
#. :func:`Problem::AddResidualBlock`, :class:`SizedFunction`,
   :class:`AutoDiffCostFunction`, :class:`NumericDiffCostFunction`
   support an arbitrary number of parameter blocks using variadic
   templates (Johannes Beck)
#. On Apple platforms, support for Apple's Accelerate framework as a
   sparse linear algebra library. (Alex Stewart)
#. Significantly faster AutoDiff (Darius Rueckert)
#. Mixed precision solves when using
   ``SPARSE_NORMAL_CHOLESKY``. (Sameer Agarwal)
#. ``LocalParameterization`` objects can have a zero sized tangent
   size, which effectively makes the parameter block constant. In
   particular, this allows for a ``SubsetParameterization`` that holds
   all the coordinates of a parameter block constant. (Sameer Agarwal
   & Emil Ernerfeldt)
#. Visibility based preconditioning now works with ``Eigen`` and
   ``CXSparse``. (Sameer Agarwal)
#. Added :func:`Problem::EvaluateResidualBlock` and
   :func:`Problem::EvaluateResidualBlockAssumingParametersUnchanged`. (Sameer
   Agarwal)
#. ``GradientChecker`` now uses ``RIDDERS`` method for more accurate
   numerical derivatives. (Sameer Agarwal)
#. Covariance computation uses a faster SVD algorithm (Johannes Beck)
#. A new local parameterization for lines (Johannes Beck)
#. A new (``SUBSET``) preconditioner for problems with general
   sparsity. (Sameer Agarwal)
#. Faster Schur elimination using faster custom BLAS routines for
   small matrices. (yangfan)
#. Automatic differentiation for ``FirstOrderFunction`` in the form of
   :class:`AutoDiffFirstOrderFunction`. (Sameer Agarwal)
#. ``TinySolverAutoDiffFunction`` now supports dynamic number of residuals
   just like ``AutoDiffCostFunction``. (Johannes Graeter)

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

#. ``EvaluationCallback`` has been moved from ``Solver::Options`` to
   ``Problem::Options`` for a more correct API.
#. Removed ``Android.mk`` based build.
#. ``Solver::Options::num_linear_solver_threads`` is no more.

Bug Fixes & Minor Changes
-------------------------
#. Use CMAKE_PREFIX_PATH to pass Homebrew install location (Alex Stewart)
#. Add automatic differentiation support for ``Erf`` and ``Erfc``. (Morten Hennemose)
#. Add a move constructor to ``AutoDiffCostFunction``, ``NumericDiffCostFunction``, ``DynamicAutoDiffCostFunction`` and ``DynamicNumericDiffCostFunction``. (Julian Kent & Sameer Agarwal)
#. Fix potential for mismatched release/debug TBB libraries (Alex Stewart)
#. Trust region minimizer now reports the gradient of the current state, rather than zero when it encounters an unsuccessful step (Sameer Agarwal & Alex Stewart)
#. Unify symbol visibility configuration for all compilers (Taylor Braun-Jones)
#. Fix the Bazel build so that it points GitLab instead of the old BitBucket repo for Eigen (Sameer Agarwal)
#. Reformat source to be clang-format clean and add a script to format the repo using clang-format. (Nikolaus Demmel)
#. Various documentation improvements (Sameer Agarwal, Carl Dehlin,
   Bayes Nie, Chris Choi, Frank, Kuang Fangjun, Dmitriy Korchemkin,
   huangqinjin, Patrik Huber, Nikolaus Demmel, Lorenzo Lamia)
#. Huge number of build system simplification & cleanups (Alex
   Stewart, NeroBurner, Alastair Harrison, Linus Mårtensson, Nikolaus Demmel)
#. Intel TBB based threading removed (Mike Vitus)
#. Allow :class:`SubsetParameterization` to accept an empty vector of
   constant parameters. (Sameer Agarwal & Frédéric Devernay)
#. Fix a bug in DynamicAutoDiffCostFunction when all parameters are
   constant (Ky Waegel & Sameer Agarwal)
#. Fixed incorrect argument name in ``RotationMatrixToQuaternion``
   (Alex Stewart & Frank Dellaert)
#. Do not export class template LineParameterization (huangqinjin)
#. Change the type of parameter index/offset to match their getter/setter (huangqinjin)
#. Initialize integer variables with integer instead of double (huangqinjin)
#. Add std::numeric_limit specialization for Jets (Sameer Agarwal)
#. Fix a MSVC type deduction bug in ComputeHouseholderVector (Sameer Agarwal)
#. Allow LocalParameterizations to have zero local size. (Sameer Agarwal)
#. Add photometric and relative-pose residuals to autodiff benchmarks (Nikolaus Demmel)
#. Add a constant cost function to the autodiff benchmarks (Darius Rueckert)
#. Add const to GetCovarianceMatrix#. (Johannes Beck)
#. Fix Tukey loss function (Enrique Fernandez)
#. Fix 3+ nested Jet constructor (Julian Kent)
#. Fix windows MSVC build. (Johannes Beck)
#. Fix invert PSD matrix. (Johannes Beck)
#. Remove not used using declaration (Johannes Beck)
#. Let Problem::SetParameterization be called more than once. (Sameer Agarwal)
#. Make Problem movable. (Sameer Agarwal)
#. Make EventLogger more efficient. (Sameer Agarwal)
#. Remove a CHECK failure from covariance_impl.cc (Sameer Agarwal)
#. Add a missing cast in rotation.h (Sameer Agarwal)
#. Add a specialized SchurEliminator and integrate it for the case <2,3,6> (Sameer Agarwal)
#. Remove use of SetUsage as it creates compilation problems. (Sameer Agarwal)
#. Protect declarations of lapack functions under CERES_NO_LAPACK (Sameer Agarwal)
#. Drop ROS dependency on catkin (Scott K Logan)
#. Explicitly delete the copy constructor and copy assignment operator (huangqinjin)
#. Use selfAdjoingView<Upper> in InvertPSDMatrix. (Sameer Agarwal)
#. Speed up InvertPSDMatrix (Sameer Agarwal)
#. Allow Solver::Options::max_num_line_search_step_size_iterations = 0. (Sameer Agarwal)
#. Make LineSearchMinizer work correctly with negative valued functions. (Sameer Agarwal)
#. Fix missing declaration warnings in Ceres code (Sergey Sharybin)
#. Modernize ProductParameterization. (Johannes Beck)
#.  Add some missing string-to-enum-to-string convertors. (Sameer Agarwal)
#. Add checks in rotation.h for inplace operations. (Johannes Beck)
#. Update Bazel WORKSPACE for newest Bazel (Keir Mierle)
#. TripletSparseMatrix: guard against self-assignment (ngoclinhng)
#. Fix Eigen alignment issues. (Johannes Beck)
#. Add the missing <array> header to fixed_array.h (Sameer Agarwal)
#. Switch to FixedArray implementation from abseil. (Johannes Beck)
#. IdentityTransformation -> IdentityParameterization (Sameer Agarwal)
#. Reorder initializer list to make -Wreorder happy (Sam Hasinoff)
#. Reduce machoness of macro definition in cost_functor_to_function_test.cc (Sameer Agarwal)
#. Enable optional use of sanitizers (Alex Stewart)
#. Fix a typo in cubic_interpolation.h (Sameer Agarwal)
#. Update googletest/googlemock to db9b85e2. (Sameer Agarwal)
#. Fix Jacobian evaluation for constant parameter (Johannes Beck)
#. AutoDiffCostFunction: use static_assert to check if the correct overload of the constructor is used. (Christopher Wecht)
#. Avoid additional memory allocation in gradient checker (Justin Carpentier)
#. Swap the order of definition of IsValidParameterDimensionSequence. (Sameer Agarwal)
#. Add ParameterBlock::IsSetConstantByUser() (Sameer Agarwal)
#. Add parameter dims for variadic sized cost function (Johannes Beck)
#. Remove trailing zero parameter block sizes (Johannes Beck)
#. Adding integer sequence and algorithms (Johannes Beck)
#. Improve readability of LocalParameterization code. (Sameer Agarwal)
#. Simplifying Init in manual contructor (Johannes Beck)
#. Fix typo in NIST url. (Alessandro Gentilini)
#. Add a .clang-format file. (Sameer Agarwal)
#. Make ConditionedCostFunction compatible with repeated CostFunction. (Sameer Agarwal)
#. Remove conversions from a double to a Jet. (Kuang Fangjun)
#. close the file on return. (Kuang Fangjun)
#. Fix an error in the demo code for ceres::Jet. (Kuang Fangjun)
#. Recheck the residual after a new call. (Kuang Fangjun)
#. avoid recomputation. (Kuang Fangjun)
#. Fix calculation of Solver::Summary::num_threads_used. (Alex Stewart)
#. Convert calls to CHECK_NOTNULL to CHECK. (Sameer Agarwal)
#. Add a missing <cstdint> to block_structure.h (Sameer Agarwal)
#. Fix an uninitialized memory error in EvaluationCallbackTest (Sameer Agarwal)
#. Respect bounds when using Solver::Options::check_gradients (Sameer Agarwal)
#. Relax the limitation that SchurEliminator::Eliminate requires a rhs. (Sameer Agarwal)
#. Fix three out of bounds errors in CompressedRowSparseMatrix. (Sameer Agarwal)
#. Add Travis CI support. (Alex Stewart)
#. Refactor Ceres threading option configuration. (Alex Stewart)
#. Handle NULL permutation from SuiteSparseQR (Pau Gargallo)
#. Remove chunk shuffle in multithreaded SchurEliminator (Norbert Wenzel)
#. Add /bigobj to nist on MSVC. (Alex Stewart)
#. Fix 'xxx.cc has no symbols' warnings. (Alex Stewart)
#. Add a typedef to expose the scalar type used in a Jet. (Sameer Agarwal)
#. Fix a use after free bug in the tests. (Sameer Agarwal)
#. Simplify integration tests. (Sameer Agarwal)
#. Converts std::unique_lock to std::lock_guard. (Mike Vitus)
#. Bring the Bazel build in sync with the CMake build. (Sameer Agarwal)
#. Adds a ParallelFor wrapper for no threads and OpenMP. (Mike Vitus)
#. Improve the test coverage in small_blas_test (Sameer Agarwal)
#. Handle possible overflow in TrustRegionStepEvaluator. (Sameer Agarwal)
#. Fix lower-bound on result of minimising step-size polynomial. (Alex Stewart)
#. Adds missing functional include in thread_pool.h (Mike Vitus)


1.14.0
======

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

#. New ``EvaluationCallback`` API. (Keir Mierle)
#. TBB based threading (Yury Prokazov & Mike Vitus)
#. C++11 threads based threading (Mike Vitus)
#. A ``ceres::Context`` object to cache and keep track of global
   state. (Mike Vitus)
#. TinySolver - A small dense solver meant for solving small problems
   really fast. [EXPERIMENTAL] (Keir Mierle & Sameer Agarwal)
#. Bazel Build. (Keir Mierle & Rodrigo Queiro)


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

#. ``Solver::Options::num_linear_solver_threads`` is deprecated,
   ``Solver::Options::num_threads`` controls all parallelism in Ceres
   Solver now. Similarly,
   ``Solver::Summary::num_linear_solver_threads_given`` and
   ``Solver::Summary::num_linear_solver_threads_used`` are also
   deprecated.


Bug Fixes & Minor Changes
-------------------------

#. Remove armv7 from target architectures when building for iOS >= 11. (Alex Stewart)
#. Corrects the documentation of Problem::AddResidualBlock. (Mike Vitus)
#. Fixes the configuration check in port.h. (Mike Vitus)
#. Add small_blas_gemm_benchmark. (Sameer Agarwal)
#. Implement some C++11 math functions for Jet (Emil Ernerfeldt)
#. Fix integer conversion warning in MSVC. (Alex Stewart)
#. Improve NDK build error handling (Keir Mierle)
#. Fix build: -Wreorder, test fail (Keir Mierle)
#. An implementation of SubsetPreconditioner. (Sameer Agarwal)
#. Split bundle adjustment tests into individual binaries (Keir Mierle)
#. Require Eigen >= 3.3.4 on aarch64. (Alex Stewart)
#. Fix TBB detection on Windows. (Alex Stewart)
#. Improve ExecutionSummary (Sameer Agarwal)
#. Remove as typo from callbacks.h (Sameer Agarwal)
#. Removes two unimplemented class functions. (Mike Vitus)
#. Update EigenTypes to deal with 1 column matrices (Sameer Agarwal)
#. Add GradientProblemSolver::Options::update_state_every_iteration (Sameer Agarwal)
#. Fixes the pose graph example documentation. (Mike Vitus)
#. Fix Eigen >= 3.3 compilation if EIGEN_DONT_VECTORIZE set (Janick Martinez Esturo)
#. Add an optional dependency on the Google Benchmark library. (Sameer Agarwal)
#. Fix the documentation for CostFunction::Evaluate. (Sameer Agarwal)
#. Fix a mathematical typo. (Sameer Agarwal)
#. Add TBB information to Ceres version string. (Alex Stewart)
#. Move discussion of dependency licensing to Sphinx docs. (Alex Stewart)
#. Fix an erroneous namespace comment (Sameer Agarwal)
#. Fix use of unnamed type as template argument warnings on Clang. (Alex Stewart)
#. Add link for CLA in docs; minor fixes (Keir Mierle)
#. Fix tiny_solver_test (Sameer Agarwal)
#. Improve compatibility with ceres::Solver (Sameer Agarwal)
#. Refactor nist.cc to be compatible with TinySolver (Sameer Agarwal)
#. Report timings with microsecond resolution (Thomas Gamper)
#. Add missing Eigen traits to Jets (Sameer Agarwal)
#. Use high-resolution timer on Windows (Thomas Gamper)
#. Add a comment about default constructed reference counts= (Keir Mierle)
#. Delete cost and loss functions when not in use. (Sameer Agarwal)
#. Fix assert_ndk_version for >= r11. (Alex Stewart)
#. Add docs explaining how to build Ceres with OpenMP on OS X. (Alex Stewart)
#. Update LAPACK option to refer to direct use by Ceres only. (Alex Stewart)
#. Hide optional SuiteSparse vars in CMake GUI by default. (Alex Stewart)
#. Always hide TBB_LIBRARY in CMake GUI by default. (Alex Stewart)
#. Fix typo in definition of f3 in powell example (x4 -> x3). (Alex Stewart)
#. Fix suppression of C++11 propagation warning. (Alex Stewart)
#. Add new Schur specialization for 2, 4, 6. (Chris Sweeney)
#. Use const keyword for 'int thread_id' variables. (pmoulon)


1.13.0
======

New Features
------------
#. ``LineSearchMinimizer`` and ``GradientProblemSolver`` are up to 2x
   faster due to fewer function evaluations. (Sameer Agarwal)
#. ``SPARSE_NORMAL_CHOLESKY`` is significantly faster because Ceres
   now computes the normal equations exploiting the static block
   sparsity structure. (Cheng Wang & Sameer Agarwal)
#. Add compound with scalar operators for Jets. (Alex Stewart)
#. Enable support for AVX instructions for Jets. (Alex Stewart)

Backward Incompatible API Changes
---------------------------------
The enum ``CovarianceAlgorithmType`` which controls the linear algebra
algorithm used to compute the covariance used to combine the choice of
the algorithm and the choice of the sparse linear algebra library into
the enum name. So we had ``SUITE_SPARSE_QR`` and
``EIGEN_SPARSE_QR``. ``Covariance::Options`` now has a separate member
allowing the user to choose the sparse linear algebra library, just
like the solver and ``CovarianceAlgorithmType`` now takes values
``DENSE_SVD`` and ``SPARSE_QR``. This is a forward looking change that
will allow us to develop more flexible covariance estimation
algorithms with multiple linear algebra backends.

Bug Fixes & Minor Changes
-------------------------
#. Fix ``InvertPSDMatrix`` as it was triggering an Eigen assert in
   Debug mode. (Philipp Hubner)
#. Fix cmake error from CeresConfig.cmake when Ceres not found (Taylor
   Braun-Jones)
#. Completely refactored ``SparseNormalCholeskySolver``. (Sameer
   Agarwal)
#. Fixed time reporting in ``Summary::FullReport`` when
   ``LineSearchMinimizer`` is used. (Sameer Agarwal)
#. Remove unused file: collections_port.cc. (Sameer Agarwal)
#. ``SPARSE_SCHUR`` + ``CX_SPARSE`` = Faster (Sameer Agarwal)
#. Refactored a number of linear solver tests to be more thorough and
   informative. (Sameer Agarwal)
#. Pass user-specified search hints as HINTS not PATHS. (Alex Stewart)
#. Prefer Eigen installs over exported build directories. (Alex
   Stewart)
#. Add OpenMP flags when compiling for C if enabled. (Alex Stewart)
#. Add a missing ``CERES_EXPORT`` to GradientChecker (Sameer Agarwal)
#. Use target_compile_features() to specify C++11 requirement if
   available. (Alex Stewart)
#. Update docs: .netrc --> .gitcookies (Keir Mierle)
#. Fix implicit precision loss warning on 64-bit archs (Ricardo
   Sanchez-Saez)
#. Optionally use exported Eigen CMake configuration if
   available. (Alex Stewart)
#. Use ``Ceres_[SOURCE/BINARY]_DIR`` not ``CMAKE_XXX_DIR`` to support
   nesting. (Alex Stewart)
#. Update ``Problem::EvaluateOptions`` documentation. (Sameer Agarwal)
#. Add public headers to CMake target for IDEs. (Devin Lane)
#. Add an article on interfacing with automatic
   differentiation. (Sameer Agarwal)
#. Add default Fedora/Debian locations for CXSparse to search
   paths. (Alex Stewart)
#. Add a test for ``LineSearchMinimizer`` (Sameer Agarwal)
#. Flatten the table of contents. (Sameer Agarwal)
#. Fix when ``LineSearchMinimizer`` adds the ``IterationSummary``` to
   ``Solver::Summary`` (Sameer Agarwal)
#. Fix search path for miniglog headers when Ceres is exported. (Alex
   Stewart)
#. Fix ambiguous reference to ``WARNING`` when using miniglog. (Alex
   Stewart)
#. Fix Jet/Eigen compatibility for Eigen > 3.3 (Julien Pilet)
#. Add max severity option when ``MINIGLOG`` is enabled (Taylor
   Braun-Jones)
#. Improvements to Schur template specializations (Sameer Agarwal)
#. Added an article on derivatives (Sameer Agarwal)
#. Require Eigen >= 3.3 to define ScalarBinaryOpTraits in Jet. (Alex
   Stewart)
#. A hacky fix for the Eigen::FullPivLU changes. (Sameer Agarwal)
#. Specify ``ScalarBinaryOpTraits`` for Jet types. (Chris Sweeney)
#. Remove spurious conversion from doubles to Jets. (Sameer Agarwal)
#. Fix an error in the tutorial code for ``NumericDiffCostFunction``
   (Sameer Agarwal)
#. ``CERES_EXPORT`` fix to compile Ceres as DLL (Je Hyeong Hong)
#. Fix detection of deprecated Bessel function names on MSVC. (Alex
   Stewart)
#. Ensure that partial evaluation of residuals triggers an error
   (Sameer Agarwal)
#. Fix detection of CMake-built glog on Windows. (Alex Stewart)
#. Add additional search paths for glog & Eigen on Windows. (Alex
   Stewart)
#. Various minor grammar and bug fixes to the documentation (Sameer
   Agarwal, Alex Stewart, William Rucklidge)


1.12.0
======

New Features
------------
#. Aligned ``Jet`` matrices for improved automatic differentiation
   performance. (Andrew Hunter)
#. Auto-differentiable implementations of Bessel functions, ``floor``,
   and ``ceil`` (Alessandro Gentilini & Michael Vitus)
#. New 2D and 3D SLAM examples. (Michael Vitus)
#. Added ``EigenQuaternionParameterization``. (Michael Vitus)
#. Added ``Problem::IsParameterBlockConstant`` (Thomas Schneider)
#. A complete refactoring of ``TrustRegionMinimizer``. (Sameer Agarwal)
#. Gradient checking cleanup and local parameterization bugfix (David
   Gossow)


Backward Incompatible API Changes
---------------------------------
#. ``Solver::Options::numeric_derivative_relative_step_size`` has been
   renamed to
   ``Solver::Options::gradient_check_numeric_derivative_relative_step_size``. (Sameer
   Agarwal)

Bug Fixes & Minor Changes
-------------------------
#. Clear XXX_FOUND in Find<XXX>.cmake prior to searching. (Alex
   Stewart)
#. Fix versioning in the documentation (Sameer Agarwal)
#. Fix missing gflags imported target definition in
   CeresConfig.cmake. (Alex Stewart)
#. Make gflags a public dependency of Ceres if it and glog are
   found. (Alex Stewart)
#. Add support for glog exported CMake target. (Alex Stewart)
#. Use ``google::GLOG_WARNING`` instead of ``WARNING`` in tests to
   support MSVC. (Alex Stewart)
#. Update gtest and gmock to
   ``a2b8a8e07628e5fd60644b6dd99c1b5e7d7f1f47`` (Sameer Agarwal)
#. Add MSVC-specific ``#define`` to expose math constants in
   ``<cmath>``. (Alex Stewart)
#. Fix typo. indepdendent -> independent (Hung Lun)
#. Fix potential invalid reset of CMAKE_FIND_LIBRARY_PREFIXES on MSVC
   (Alex Stewart)
#. Fix use of alignas(0) which is not ignored on GCC (Alex Stewart)
#. Use default alignment if alignof(std::max_align_t) < 16 with C++11
   (Alex Stewart)
#. Introduce a common base class for DynamicAutoDiffCostFunction and
   DynamicNumericDiffCostFunction. (Sameer Agarwal)
#. Fix an exact equality test causing breakage in
   gradient_checker_test. (Sameer Agarwal)
#. Add GradientProblemSolver::Options::parameter_tolerance. (Sameer
   Agarwal)
#. Add missing T() wrappers for constants. (Rob Carroll)
#. Remove two checks from rotation.h (Sameer Agarwal)
#. Relax the tolerance in QuaternionParameterizationTestHelper. (Je
   Hyeong Hong)
#. Occured -> Occurred. (Sameer Agarwal)
#. Fix a test error in autodiff_test.cc. (Je Hyeong Hong)
#. Fix documentation source for templated function in ``rotation.h``.
#. Add ``package.xml`` to enable Catkin builds. (Damon Kohler)
#. Relaxing Jacobian matching in Gradient Checker test. (David Gossow)
#. Allow SubsetParameterization to hold all parameters constant
   (Sameer Agarwal)
#. Fix an Intel compiler error in covariance_impl.cc (Je Hyeong Hong)
#. Removing duplicate include directive. (David Gossow)
#. Remove two DCHECKs from CubicHermiteSpline. (Sameer Agarwal)
#. Fix some compiler warnings. (Richard Trieu)
#. Update ExpectArraysClose to use ExpectClose instead of
   EXPECT_NEAR. (Phillip Hubner)
#. FindWithDefault returns by value rather than reference. (@aradval)
#. Fix compiler errors on some systems. (David Gossow)
#. Note that Problem::Evaluate cannot be called from an
   IterationCallback. (Sameer Agarwal)
#. Use ProductParameterization in bundle_adjuster.cc (Sameer Agarwal)
#. Enable support for OpenMP in Clang if detected. (Alex Stewart)
#. Remove duplicate entry for the NIST example in the docs. (Michael
   Vitus)
#. Add additional logging for analyzing orderings (Sameer Agarwal)
#. Add readme for the sampled_function example. (Michael Vitus)
#. Use _j[0,1,n]() Bessel functions on MSVC to avoid deprecation
   errors. (Alex Stewart & Kichang Kim)
#. Fix: Copy minimizer option ``is_silent`` to
   ``LineSearchDirection::Options`` (Nicolai Wojke)
#. Fix typos in ``users.rst`` (Sameer Agarwal)
#. Make some Jet comparisons exact. (Sameer Agarwal)
#. Add colmap to users.rst (Sameer Agarwal)
#. Fix step norm evaluation in LineSearchMinimizer (Sameer Agarwal)
#. Remove use of -Werror when compiling Ceres. (Alex Stewart)
#. Report Ceres compile options as components in find_package(). (Alex
   Stewart)
#. Fix a spelling error in nnls_modeling.rst (Timer)
#. Only use collapse() directive with OpenMP 3.0 or higher. (Keir
   Mierle)
#. Fix install path for CeresConfig.cmake to be architecture-aware.
#. Fix double conversion to degrees in rotation_test (Keir Mierle)
#. Make Jet string output more readable (Keir Mierle)
#. Fix rotation_test IsClose() and related tests (Keir Mierle)
#. Loosen an exact equality in local_parameterization_test (Sameer
   Agarwal)
#. make_docs: Pass the file encoding to open() (Niels Ole Salscheider)
#. Fix error message returned when using SUITE_SPARSE_QR in covariance
   estimation on a ceres built without SuiteSparse support. (Simon
   Rutishauser)
#. Fix CXX11 option to be available on MinGW & CygWin, but not
   MSVC. (Alex Stewart)
#. Fix missing early return() in xxx_not_found() dependency
   macros. (Alex Stewart)
#. Initialize ``inner_iterations_were_useful_`` correctly. (Sameer
   Agarwal)
#. Add an implementation for GradientProblemSolver::Options::IsValid
   (Sameer Agarwal)
#. Fix use of va_copy() if compiling with explicit C++ version <
   C++11. (Alex Stewart)
#. Install CMake files to lib/cmake/Ceres (Niels Ole Salscheider)
#. Allow users to override the documentation install directory. (Niels
   Ole Salscheider)
#. Add covariance matrix for a vector of parameters (Wannes Van Loock)
#. Saner tolerances & stricter LRE test. (Sameer Agarwal)
#. Fix a malformed sentence in the tutorial. (Sameer Agarwal)
#. Add logging for sparse Cholesky factorization using Eigen. (Sameer
   Agarwal)
#. Use std::adjacent_find instead of std::unique. (Sameer Agarwal)
#. Improve logging in CompressedRowJacobianWriter on crash. (Sameer
   Agarwal)
#. Fix free parameter block handling in covariance computation (Wannes
   Van Loock)
#. Report the number of line search steps in FullReport. (Sameer
   Agarwal)
#. Make CMake read Ceres version directly from
   include/ceres/version.h. (Alex Stewart)
#. Lots of code style/lint changes. (William Rucklidge)
#. Fix covariance computation for constant blocks (Wannes Van Loock)
#. Add IOS_DEPLOYMENT_TARGET variable to iOS.cmake (Eduard Feicho)
#. Make miniglog threadsafe on non-windows system by using
   localtime_r() instead of localtime() for time formatting (Simon
   Rutishauser)

1.11.0
======

New Features
------------
#. Adaptive numeric differentiation using Ridders' method. (Tal
   Ben-Nun)
#. Add ``CubicInterpolator`` and ``BiCubicInterpolator`` to allow
   smooth interpolation of sampled functions and integration with
   automatic differentiation.
#. Add method to return covariance in tangent space. (Michael Vitus &
   Steve Hsu)
#. Add Homogeneous vector parameterization. (Michael Vitus)
#. Add a ``ProductParameterization``, a local parameterization that
   can be constructed as a cartesian product of other local
   parameterization.
#. Add DynamicCostFunctionToFunctor. (David Gossow)
#. Optionally export Ceres build directory into local CMake package
   registry.
#. Faster ``SPARSE_NORMAL_CHOLESKY`` in the presence of dynamic
   sparsity.

Bug Fixes & Minor Changes
-------------------------
#. Remove use of link-time optimisation (LTO) for all compilers due to
   portability issues with gtest / type_info::operator== & Eigen with
   Clang on OS X vs GCC 4.9+ on Linux requiring contradictory 'fixes'.
#. Use link-time optimisation (LTO) only when compiling Ceres itself,
   not tests or examples, to bypass gtest / type_info::operator==
   issue.
#. Use old minimum iOS version flags on Xcode < 7.0.
#. Add gtest-specific flags when building/using as a shared library.
#. Clean up iOS.cmake to use xcrun/xcodebuild & libtool.
#. Import the latest version of ``googletest``.
#. Refactored ``system_test`` into ``bundle_adjustment_test`` and
   ``system_test``, where each test case is its own test.
#. Fix invalid memory access bug in
   ``CompressedRowSparseMatrix::AppendRows`` when it was called with a
   matrix of size zero.
#. Build position independent code when compiling Ceres statically
   (Alexander Alekhin).
#. Fix a bug in DetectStructure (Johannes Schonberger).
#. Reduce memory footprint of SubsetParameterization (Johannes
   Schonberger).
#. Fix for reorder program unit test when built without suitesparse
   (Sergey Sharybin).
#. Fix a bug in the Schur eliminator (Werner Trobin).
#. Fix a bug in the reordering code (Bernhard Zeisl).
#. Add missing CERES_EXPORT to ComposedLoss (Simon Rutishauser).
#. Add the option to use numeric differentiation to ``nist`` and
   ``more_garbow_hillstrom``.
#. Fix EIGENSPARSE option help s/t it displays in CMake ncurses GUI.
#. Fix SparseNormalCholeskySolver with dynamic sparsity (Richie
   Stebbing).
#. Remove legacy dependency detection macros.
#. Fix failed if() condition expansion if gflags is not found.
#. Update all CMake to lowercase function name style.
#. Update minimum iOS version to 7.0 for shared_ptr/unordered_map.
#. Fix bug in gflags' <= 2.1.2 exported CMake configuration.
#. Remove the spec file needed for generating RPMs.
#. Fix a typo in small_blas.h (Werber Trobin).
#. Cleanup FindGflags & use installed gflags CMake config if present.
#. Add default glog install location on Windows to search paths
   (bvanevery).
#. Add default Eigen install location on Windows to search paths
   (bvanevery).
#. Fix explanation of config.h generation in bare config.h.
#. Fix unused parameter compiler warnings in numeric_diff.h.
#. Increase tolerance for a test in polynomial_test (Taylor Braun
   Jones).
#. Fix addition of Gerrit commit hook when Ceres is a git submodule
   (Chris Cooper).
#. Fix missing EIGEN_VERSION expansion typo.
#. Fix links to SuiteSparse & CXSparse (Henrique Mendonça).
#. Ensure Eigen is at least 3.1.0 for Eigen/SparseCore.
#. Add option to use C++11 (not TR1) shared_ptr & unordered_map
   (Norman Goldstein).
#. Fix an incorrect usage message in bundle_adjuster.cc
#. Gracefully disable docs if Sphinx is not found.
#. Explicitly use (new) default OS X rpath policy if present.
#. Add support of EIGEN_SPARSE type in
   IsSparseLinearAlgebraLibraryTypeAvailable function (Pierre Moulon).
#. Allow the LossFunction contained in a LossFunctionWrapper to be
   NULL. This is consistent with how NULL LossFunctions are treated
   everywhere else. (Simon Rutishauser).
#. Improve numeric differentation near zero.
#. Refactored DynamicNumericDiffCostFunction to use NumericDiff (Tal
   Ben-Nun).
#. Remove use of :caption tag in Sphinx.
#. Add a small test to make sure GradientProblemSolver works correctly
   (Petter Strandmark).
#. Add simple unit tests for GradientProblem (Petter Strandmark).
#. Make the robust curve fitting example robust.
#. Homogenize convergence operators in docs and code (Johannes
   Schonberger).
#. Add parameter_tolerance convergence to line search minimizer
   (Johannes Schonberger).
#. Fix bug where pow(JetA,JetB) returned wrong result for JetA==0
   (Russell Smith).
#. Remove duplicate step norm computation (Johannes Schonberger).
#. Enhance usability when encountering Eigen version mismatches
   (Andrew Hundt).
#. Add PLY file logger before and after BA in order to ease visual
   comparison (Pierre Moulon).
#. Fix CMake config file docs to include 2.8.x & 3.x styles.
#. Python3 fixes (Markus Moll).
#. Remove confusing code from DenseJacobianWriter (Michael Vitus).
#. Add documentation on CMake package installation process.
#. Revert a call to SolveUpperTriangularUsingCholesky.
#. Make CERES_EIGEN_VERSION macro independent of CMake.
#. Add versions of dependencies used to FullReport().
#. Ensure local config.h is used if Ceres is already installed.
#. Small messaging and comment updates in CMake
#. Handle possible presence of library prefixes in MSVC (Sylvain
   Duchêne).
#. Use -O2 not -O3 on MinGW to workaround issue with Eigen
   (s1m3mu3@gmail.com).
#. Increase tolerance in small_blas test for Cygwin
   (s1m3mu3@gmail.com).
#. Fix iOS cmake file for cmake 3.0 (Jack Feng)
#. Fix missing gflags shlwapi dependency on MinGW (s1m3mu3@gmail.com).
#. Add thread dependency & fix namespace detection on Windows for
   gflags (arrigo.benedetti@gmail.com).
#. Rename macros in the public API to have a ``CERES_`` prefix.
#. Fix ``OrderedGroup::Reverse()`` when it is empty (Chris Sweeney).
#. Update the code to point to ceres-solver.org.
#. Update documentation to point to the GitHub issue tracker.
#. Disable ``LAPACK`` for iOS builds. (Greg Coombe)
#. Force use of single-thread in ``Problem::Evaluate()`` without
   OpenMP.
#. Less strict check for multithreading. (Chris Sweeney)
#. Update tolerances in small_blas_test.cc (Philipp Hubner)
#. Documentation corrections (Steve Hsu)
#. Fixed ``sampled_function.cc`` (Pablo Speciale)
#. Fix example code in the documentation. (Rodney Hoskinson)
#. Improve the error handling in Conjugate Gradients.
#. Improve preconditioner documentation.
#. Remove dead code from fpclassify.h.
#. Make Android.mk threads sensitive.
#. Changed the ``CURRENT_CONFIG_INSTALL_DIR`` to be a variable local
   to Ceres. (Chris Sweeney)
#. Fix typo in the comments in ``Jet.h``. (Julius Ziegler)
#. Add the ASL at ETH Zurich, Theia & OpenPTrack to the list of users.
#. Fixed a typo in the documentation. (Richard Stebbing)
#. Fixed a boundary handling bug in the BiCubic interpolation
   code. (Bernhard Zeisl)
#. Fixed a ``MSVC`` compilation bug in the cubic interpolation code
   (Johannes Schönberger)
#. Add covariance related files to the Android build.
#. Update Ubuntu 14.04 installation instructions. (Filippo Basso)
#. Improved logging for linear solver failures.
#. Improved crash messages in ``Problem``.
#. Hide Homebrew related variables in CMake GUI.
#. Add SuiteSparse link dependency for
   compressed_col_sparse_matrix_utils_test.
#. Autodetect Homebrew install prefix on OSX.
#. Lint changes from William Rucklidge and Jim Roseborough.
#. Remove ``using namespace std:`` from ``port.h``
#. Add note about glog not currently compiling against gflags 2.1.
#. Add explicit no sparse linear algebra library available option.
#. Improve some wording in the FAQ. (Vasily Vylkov)
#. Delete Incomplete LQ Factorization.
#. Add a pointer to MacPorts. (Markus Moll)


1.10.0
======

New Features
------------
#. Ceres Solver can now be used to solve general unconstrained
   optimization problems. See the documentation for
   ``GradientProblem`` and ``GradientProblemSolver``.
#. ``Eigen`` can now be as a sparse linear algebra backend. This can
   be done by setting
   ``Solver::Options::sparse_linear_algebra_library_type`` to
   ``EIGEN_SPARSE``. Performance should be comparable to
   ``CX_SPARSE``.

   .. NOTE::

      Because ``Eigen`` is a header only library, and some of the code
      related to sparse Cholesky factorization is LGPL, building Ceres
      with support for Eigen's sparse linear algebra is disabled by
      default and should be enabled explicitly.

   .. NOTE::

      For good performance, use Eigen version 3.2.2 or later.

#. Added ``EIGEN_SPARSE_QR`` algorithm for covariance estimation using
   ``Eigen``'s sparse QR factorization. (Michael Vitus)
#. Faster inner iterations when using multiple threads.
#. Faster ``ITERATIVE_SCHUR`` + ``SCHUR_JACOBI`` for small to medium
   sized problems (see documentation for
   ``Solver::Options::use_explicit_schur_complement``).
#. Faster automatic Schur ordering.
#. Reduced memory usage when solving problems with dynamic sparsity.
#. ``CostFunctionToFunctor`` now supports dynamic number of residuals.
#. A complete re-write of the problem preprocessing phase.
#. ``Solver::Summary::FullReport`` now reports the build configuration
   for Ceres.
#. When building on Android, the ``NDK`` version detection logic has
   been improved.
#. The ``CERES_VERSION`` macro has been improved and replaced with the
   ``CERES_VERSION_STRING`` macro.
#. Added ``Solver::Options::IsValid`` which allows users to validate
   their solver configuration before calling ``Solve``.
#. Added ``Problem::GetCostFunctionForResidualBlock`` and
   ``Problem::GetLossFunctionForResidualBlock``.
#. Added Tukey's loss function. (Michael Vitus)
#. Added RotationMatrixToQuaternion
#. Compute & report timing information for line searches.
#. Autodetect gflags namespace.
#. Expanded ``more_garbow_hillstrom.cc``.
#. Added a pointer to Tal Ben-Nun's MSVC wrapper to the docs.
#. Added the ``<2,3,6>`` Schur template specialization. (Alessandro
   Dal Grande)

Backward Incompatible API Changes
---------------------------------
#. ``NumericDiffFunctor`` has been removed. It's API was broken, and
   the implementation was an unnecessary layer of abstraction over
   ``CostFunctionToFunctor``.
#. ``POLAK_RIBIRERE`` conjugate gradients direction type has been
   renamed to ``POLAK_RIBIERE``.
#. ``Solver::Options::solver_log`` has been removed. If needed this
   iteration callback can easily be implemented in user code.
#. The ``SPARSE_CHOLESKY`` algorithm for covariance estimation has
   been removed. It is not rank revealing and numerically poorly
   behaved. Sparse QR factorization is a much better way to do this.
#. The ``SPARSE_QR`` algorithm for covariance estimation has been
   renamed to ``SUITE_SPARSE_QR`` to be consistent with
   ``EIGEN_SPARSE_QR``.
#. ``Solver::Summary::preconditioner_type`` has been replaced with
   ``Solver::Summary::preconditioner_type_given`` and
   ``Solver::Summary::preconditioner_type_used`` to be more consistent
   with how information about the linear solver is communicated.
#. ``CERES_VERSION`` and ``CERES_ABI_VERSION`` macros were not
   terribly useful. They have been replaced with
   ``CERES_VERSION_MAJOR``, ``CERES_VERSION_MINOR`` ,
   ``CERES_VERSION_REVISION`` and ``CERES_VERSION_ABI`` macros. In
   particular the functionality of ``CERES_VERSION`` is provided by
   ``CERES_VERSION_STRING`` macro.

Bug Fixes
---------
#. Do not try the gradient step if TR step line search fails.
#. Fix missing include in libmv_bundle_adjuster on OSX.
#. Conditionally log evaluation failure warnings.
#. Runtime uses four digits after the decimal in Summary:FullReport.
#. Better options checking for TrustRegionMinimizer.
#. Fix RotationMatrixToAngleAxis when the angle of rotation is near
   PI. (Tobias Strauss)
#. Sometimes gradient norm based convergence would miss a step with a
   substantial solution quality improvement. (Rodney Hoskinson)
#. Ignore warnings from within Eigen/SparseQR (3.2.2).
#. Fix empty Cache HELPSTRING parsing error on OS X 10.10 Yosemite.
#. Fix a formatting error TrustRegionMinimizer logging.
#. Add an explicit include for local_parameterization.h (cooordz)
#. Fix a number of typos in the documentation (Martin Baeuml)
#. Made the logging in TrustRegionMinimizer consistent with
   LineSearchMinimizer.
#. Fix some obsolete documentation in CostFunction::Evaluate.
#. Fix CG solver options for ITERATIVE_SCHUR, which did not copy
   min_num_iterations (Johannes Schönberger)
#. Remove obsolete include of numeric_diff_functor.h. (Martin Baeuml)
#. Fix max. linear solver iterations in ConjugateGradientsSolver
   (Johannes Schönberger)
#. Expand check for lack of a sparse linear algebra library. (Michael
   Samples and Domink Reitzle)
#. Fix Eigen Row/ColMajor bug in NumericDiffCostFunction. (Dominik
   Reitzle)
#. Fix crash in Covariance if # threads > 1 requested without OpenMP.
#. Fixed Malformed regex. (Björn Piltz)
#. Fixed MSVC error C2124: divide or mod by zero. (Björn Piltz)
#. Add missing #include of <limits> for loss functions.
#. Make canned loss functions more robust.
#. Fix type of suppressed compiler warning for Eigen 3.2.0.
#. Suppress unused variable warning from Eigen 3.2.0.
#. Add "make install" to the install instructions.
#. Correct formula in documentation of
   Solver::Options::function_tolerance. (Alessandro Gentilini)
#. Add release flags to iOS toolchain.
#. Fix a broken hyperlink in the documentation. (Henrique Mendonca)
#. Add fixes for multiple definitions of ERROR on Windows to docs.
#. Compile miniglog into Ceres if enabled on all platforms.
#. Add two missing files to Android.mk (Greg Coombe)
#. Fix Cmake error when using miniglog. (Greg Coombe)
#. Don't build miniglog unconditionally as a static library (Björn
   Piltz)
#. Added a missing include. (Björn Piltz)
#. Conditionally disable SparseNormalCholesky.
#. Fix a memory leak in program_test.cc.


1.9.0
=====

New Features
------------
#. Bounds constraints: Support for upper and/or lower bounds on
   parameters when using the trust region minimizer.
#. Dynamic Sparsity: Problems in which the sparsity structure of the
   Jacobian changes over the course of the optimization can now be
   solved much more efficiently. (Richard Stebbing)
#. Improved support for Microsoft Visual C++ including the ability to
   build and ship DLLs. (Björn Piltz, Alex Stewart and Sergey
   Sharybin)
#. Support for building on iOS 6.0 or higher (Jack Feng).
#. Autogeneration of config.h that captures all the defines used to
   build and use Ceres Solver.
#. Simpler and more informative solver termination type
   reporting. (See below for more details)
#. New `website <http://www.ceres-solver.org>`_ based entirely on
   Sphinx.
#. ``AutoDiffLocalParameterization`` allows the use of automatic
   differentiation for defining ``LocalParameterization`` objects
   (Alex Stewart)
#. LBFGS is faster due to fewer memory copies.
#. Parameter blocks are not restricted to be less than 32k in size,
   they can be up to 2G in size.
#. Faster ``SPARSE_NORMAL_CHOLESKY`` solver when using ``CX_SPARSE``
   as the sparse linear algebra library.
#. Added ``Problem::IsParameterBlockPresent`` and
   ``Problem::GetParameterization``.
#. Added the (2,4,9) and (2,4,8) template specializations.
#. An example demonstrating the use of
   DynamicAutoDiffCostFunction. (Joydeep Biswas)
#. Homography estimation example from Blender demonstrating the use of
   a custom ``IterationCallback``. (Sergey Sharybin)
#. Support user passing a custom CMAKE_MODULE_PATH (for BLAS /
   LAPACK).

Backward Incompatible API Changes
---------------------------------
#. ``Solver::Options::linear_solver_ordering`` used to be a naked
   pointer that Ceres took ownership of. This is error prone behaviour
   which leads to problems when copying the ``Solver::Options`` struct
   around. This has been replaced with a ``shared_ptr`` to handle
   ownership correctly across copies.

#. The enum used for reporting the termination/convergence status of
   the solver has been renamed from ``SolverTerminationType`` to
   ``TerminationType``.

   The enum values have also changed. ``FUNCTION_TOLERANCE``,
   ``GRADIENT_TOLERANCE`` and ``PARAMETER_TOLERANCE`` have all been
   replaced by ``CONVERGENCE``.

   ``NUMERICAL_FAILURE`` has been replaced by ``FAILURE``.

   ``USER_ABORT`` has been renamed to ``USER_FAILURE``.

   Further ``Solver::Summary::error`` has been renamed to
   ``Solver::Summary::message``. It contains a more detailed
   explanation for why the solver terminated.

#. ``Solver::Options::gradient_tolerance`` used to be a relative
   gradient tolerance. i.e., The solver converged when

   .. math:: \|g(x)\|_\infty < \text{gradient_tolerance} *
      \|g(x_0)\|_\infty

   where :math:`g(x)` is the gradient of the objective function at
   :math:`x` and :math:`x_0` is the parmeter vector at the start of
   the optimization.

   This has changed to an absolute tolerance, i.e. the solver
   converges when

   .. math:: \|g(x)\|_\infty < \text{gradient_tolerance}

#. Ceres cannot be built without the line search minimizer
   anymore. Thus the preprocessor define
   ``CERES_NO_LINE_SEARCH_MINIMIZER`` has been removed.

Bug Fixes
---------
#. Disabled warning C4251. (Björn Piltz)
#. Do not propagate 3d party libs through
   `IMPORTED_LINK_INTERFACE_LIBRARIES_[DEBUG/RELEASE]` mechanism when
   building shared libraries. (Björn Piltz)
#. Fixed errant verbose levels (Björn Piltz)
#. Variety of code cleanups, optimizations and bug fixes to the line
   search minimizer code (Alex Stewart)
#. Fixed ``BlockSparseMatrix::Transpose`` when the matrix has row and
   column blocks. (Richard Bowen)
#. Better error checking when ``Problem::RemoveResidualBlock`` is
   called. (Alex Stewart)
#. Fixed a memory leak in ``SchurComplementSolver``.
#. Added ``epsilon()`` method to ``NumTraits<ceres::Jet<T, N>
   >``. (Filippo Basso)
#. Fixed a bug in `CompressedRowSparseMatrix::AppendRows`` and
   ``DeleteRows``.q
#. Handle empty problems consistently.
#. Restore the state of the ``Problem`` after a call to
   ``Problem::Evaluate``. (Stefan Leutenegger)
#. Better error checking and reporting for linear solvers.
#. Use explicit formula to solve quadratic polynomials instead of the
   eigenvalue solver.
#. Fix constant parameter handling in inner iterations (Mikael
   Persson).
#. SuiteSparse errors do not cause a fatal crash anymore.
#. Fix ``corrector_test.cc``.
#. Relax the requirements on loss function derivatives.
#. Minor bugfix to logging.h (Scott Ettinger)
#. Updated ``gmock`` and ``gtest`` to the latest upstream version.
#. Fix build breakage on old versions of SuiteSparse.
#. Fixed build issues related to Clang / LLVM 3.4 (Johannes
   Schönberger)
#. METIS_FOUND is never set. Changed the commit to fit the setting of
   the other #._FOUND definitions. (Andreas Franek)
#. Variety of bug fixes and cleanups to the ``CMake`` build system
   (Alex Stewart)
#. Removed fictitious shared library target from the NDK build.
#. Solver::Options now uses ``shared_ptr`` to handle ownership of
   ``Solver::Options::linear_solver_ordering`` and
   ``Solver::Options::inner_iteration_ordering``. As a consequence the
   ``NDK`` build now depends on ``libc++`` from the ``LLVM`` project.
#. Variety of lint cleanups (William Rucklidge & Jim Roseborough)
#. Various internal cleanups including dead code removal.


1.8.0
=====

New Features
------------
#. Significant improved ``CMake`` files with better robustness,
   dependency checking and GUI support. (Alex Stewart)
#. Added ``DynamicNumericDiffCostFunction`` for numerically
   differentiated cost functions whose sizing is determined at run
   time.
#. ``NumericDiffCostFunction`` now supports a dynamic number of
   residuals just like ``AutoDiffCostFunction``.
#. ``Problem`` exposes more of its structure in its API.
#. Faster automatic differentiation (Tim Langlois)
#. Added the commonly occurring ``2_d_d`` template specialization for
   the Schur Eliminator.
#. Faster ``ITERATIVE_SCHUR`` solver using template specializations.
#. Faster ``SCHUR_JACOBI`` preconditioner construction.
#. Faster ``AngleAxisRotatePoint``.
#. Faster Jacobian evaluation when a loss function is used.
#. Added support for multiple clustering algorithms in visibility
   based preconditioning, including a new fast single linkage
   clustering algorithm.

Bug Fixes
---------
#. Fix ordering of ParseCommandLineFlags() & InitGoogleTest() for
   Windows. (Alex Stewart)
#. Remove DCHECK_GE checks from fixed_array.h.
#. Fix build on MSVC 2013 (Petter Strandmark)
#. Fixed ``AngleAxisToRotationMatrix`` near zero.
#. Move ``CERES_HASH_NAMESPACE`` macros to ``collections_port.h``.
#. Fix handling of unordered_map/unordered_set on OSX 10.9.0.
#. Explicitly link to libm for ``curve_fitting_c.c``. (Alex Stewart)
#. Minor type conversion fix to autodiff.h
#. Remove RuntimeNumericDiffCostFunction.
#. Fix operator= ambiguity on some versions of Clang. (Alex Stewart)
#. Various Lint cleanups (William Rucklidge & Jim Roseborough)
#. Modified installation folders for Windows. (Pablo Speciale)
#. Added librt to link libraries for SuiteSparse_config on
   Linux. (Alex Stewart)
#. Check for presence of return-type-c-linkage option with
   Clang. (Alex Stewart)
#. Fix Problem::RemoveParameterBlock after calling solve. (Simon
   Lynen)
#. Fix a free/delete bug in covariance_impl.cc
#. Fix two build errors. (Dustin Lang)
#. Add RequireInitialization = 1 to NumTraits::Jet.
#. Update gmock/gtest to 1.7.0
#. Added IterationSummary::gradient_norm.
#. Reduced verbosity of the inner iteration minimizer.
#. Fixed a bug in TrustRegionMinimizer. (Michael Vitus)
#. Removed android/build_android.sh.


1.7.0
=====

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

#. ``Solver::Options::sparse_linear_algebra_library`` has been renamed
   to ``Solver::Options::sparse_linear_algebra_library_type``.

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.
#. Faster ``DENSE_QR``, ``DENSE_NORMAL_CHOLESKY`` and ``DENSE_SCHUR``
   solvers.
#. Support for multiple dense linear algebra backends. In particular
   optimized ``BLAS`` and ``LAPACK`` implementations (e.g., Intel MKL,
   ACML, OpenBLAS etc) can now be used to do the dense linear algebra
   for ``DENSE_QR``, ``DENSE_NORMAL_CHOLESKY`` and ``DENSE_SCHUR``
#. 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``.
#. Improved inner iteration step acceptance criterion.
#. Add BlockRandomAccessCRSMatrix.
#. Speeded up automatic differentiation by 7\%.
#. Bundle adjustment example from libmv/Blender (Sergey Sharybin)
#. Shared library building is now controlled by CMake, rather than a
   custom solution. Previously, Ceres had a custom option, but this is
   now deprecated in favor of CMake's built in support for switching
   between static and shared. Turn on BUILD_SHARED_LIBS to get shared
   Ceres libraries.
#. 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)
#. Simplifications to the cmake build file.
#. ``miniglog`` can now be used as a replacement for ``google-glog``
   on non Android platforms. (This is NOT recommended).

Bug Fixes
---------
#. Fix ``ITERATIVE_SCHUR`` solver to work correctly when the schur
   complement is of size zero. (Soohyun Bae)
#. Fix the ``spec`` file for generating ``RPM`` packages (Brian Pitts
   and Taylor Braun-Jones).
#. Fix how ceres calls CAMD (Manas Jagadev)
#. Fix breakage on old versions of SuiteSparse. (Fisher Yu)
#. Fix warning C4373 in Visual Studio (Petter Strandmark)
#. Fix compilation error caused by missing suitesparse headers and
   reorganize them to be more robust. (Sergey Sharybin)
#. Check GCC Version before adding -fast compiler option on
   OSX. (Steven Lovegrove)
#. 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 errors in documentation (Pablo Speciale)
#. Updated depend.cmake to follow CMake IF convention. (Joydeep
   Biswas)
#. Stabilize 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.
#. Fix miniglog-based Android NDK build; now works with NDK r9. (Scott
   Ettinger)


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 variadic 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 incorrect 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 open source release. Nathan Wiegand contributed to the Mac OSX
port.


Origins
=======

Ceres Solver grew out of the need for general least squares solving at
Google. In early 2010, Sameer Agarwal and Frederik Schaffalitzky
started the development of Ceres Solver. Frederik left Google shortly
thereafter and Keir Mierle stepped in to take his place. After two
years of on-and-off development, Ceres Solver was released as open
source in May of 2012.
