# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
# SPDX-FileCopyrightText: Bradley M. Bell <bradbell@seanet.com>
# SPDX-FileContributor: 2003-23 Bradley M. Bell
# ----------------------------------------------------------------------------

{xrst_begin whats_new_17 app}
{xrst_spell
   autotools
   colorings
   deallocations
   doxydoc
   doxygen
   iterate
   iterating
   md
   perl
   plugin
   readme
   subgraphs
   typedef
   uninitialised
   uninitialized
   valgrind
   wconversion
   xq
}

Changes and Additions to CppAD During 2017
##########################################

mm-dd
*****

API Changes
===========
Speed tests no longer automatically compile in release mode; see
:ref:`speed@debug_which`

12-14
=====
Add the :ref:`subgraph_hes2jac.cpp-name` example
which computes sparse Hessians using subgraphs and Jacobians.

12-08
=====
A multi-threading
wish list item was added.

12-06
=====
A :ref:`wish_list-name` item to enable one to iterate through a
``const`` :ref:`ADFun-name` operation sequence was completed.
In addition, the :ref:`abs_normal_fun@f` argument to the
``abs_normal`` operation was converted to be ``const`` .

12-05
=====
The internal data object used to represent sparsity patterns as
vectors of integers was improved;
see :ref:`for_jac_sparsity@internal_bool`
in ``for_jac_sparsity`` and other
:ref:`sparsity_pattern@Preferred Sparsity Pattern Calculations` .

12-04
=====
Back out the ``hold_reverse_memory`` option.

12-01
=====
The ``hold_reverse_memory`` option was added.

11-30
=====
Edit the :ref:`download-name` instructions.

11-23
=====
The ``ADFun`` function :ref:`optimizer<optimize-name>`
was not handling hash code collisions properly.
To be specific, only the arguments
that were variables where checked for a complete match.
The arguments that are constants need to also be checked.
This has been fixed.

11-20
=====

#. Add the :ref:`subgraph_jac_rev-name` method for computing
   sparse Jacobians.
#. Add the :ref:`speed_main@Global Options@subgraph` option
   to the CppAD speed tests.

11-19
=====
Add the :ref:`subgraph_reverse-name` method for computing
sparse derivatives.
This was inspired by the TMB package.

11-15
=====

#. Add wish list item for :ref:`subgraph sparsity<wish_list@Subgraph@Sparsity>` .
#. Fix :ref:`cmake_check-name` when :ref:`cmake@include_ipopt`
   is not present on the cmake command line
   (make was trying to build some of the ipopt tests).

11-13
=====

#. Add the :ref:`speed_main@Global Options@hes2jac` option
   to the CppAD speed tests.
#. Implement the
   :ref:`speed_main@Sparsity Options@subsparsity` option
   for the CppAD :ref:`sparse_hessian<link_sparse_hessian-name>` test.
#. Fix detection of invalid options in the speed test programs; see the
   :ref:`global<speed_main@Global Options>` and
   :ref:`sparsity<speed_main@Sparsity Options>` options.

11-12
=====
Add the :ref:`speed_main@Sparsity Options@subsparsity` option
to the CppAD speed tests.

11-08
=====
Add the :ref:`subgraph_sparsity-name` method for computing
dependency and sparsity.
This was inspired by the
`TMB <https://cran.r-project.org/web/packages/TMB/index.html>`_ package.

11-06
=====
More information has been added to the operation sequence.
To be specific, the extra amount of

   ``f`` . *size_op* () * *sizeof* ( ``tape_addr_type`` )

was added to the value returned by
:ref:`fun_property@size_op_seq` .

11-04
=====
The method for iterating through the tape has been changed.
It now includes an extra data structure that makes it faster,
but also requires slightly more memory. To be specific, the term

   ``f`` . *size_op* () * *sizeof* ( ``tape_addr_type`` ) * 2

was added to the value returned by
:ref:`fun_property@size_op_seq` .
In addition, some minor corrections were made to the
:ref:`tape_addr_type<cmake@cppad_tape_addr_type>`
requirements.

10-23
=====

#. Require ``cmake.3.1`` or greater and fix
   a cmake warning by always using the new ``CMP0054`` policy.
#. Fix a ``g++ 7.2.1`` warning about a possibly uninitialized value
   in the file ``cppad/local/optimize/hash_code.hpp`` .

09-16
=====
An optimization memory entry
was added to the wish list
and the :ref:`wish_list@check_finite` entry was modified.

08-30
=====

#. If :ref:`colpack_prefix-name` was not specified, one would get the following
   waring during the :ref:`cmake-name` command:

      ``Policy CMP0046 is not set: Error on non-existent dependency in``

   This has been fixed by not adding the dependency when it is not needed.
#. There was a problem running :ref:`make check<cmake_check-name>`
   when :ref:`cmake@cppad_cxx_flags` was not specified.
   This has been fixed.
   This was probably introduced on :ref:`whats_new_17@mm-dd@05-29` .

08-29
=====
There was a problem on some systems that created an error when
specializing the ``is_pod`` template function in the
``CppAD::local`` namespace.
This has been fixed by testing for compatibility at during the
:ref:`cmake-name` command and creating the file ``cppad/local/is_pod.hpp`` .

08-09
=====
Add the :ref:`wish_list@test_boolofvoid`
wish list item.

08-08
=====

#. The :ref:`eigen_plugin.hpp-name` was put back in the
   :ref:`cppad_eigen.hpp-name` definitions.
   This makes CppAD incompatible with older versions of eigen; e.g., eigen-3.2.9.
   The plugin was removed on :ref:`whats_new_17@mm-dd@05-12` .
#. Fix some minor typos in the documentation.
   To be specific:
   The font, in the :ref:`sparse_rc-name` and :ref:`sparse_rcv-name` syntax,
   for the text

      *target* = *pattern*

   The font, in :ref:`capacity_order-name` , for the text

      *xq* . ``size`` () == *f* . ``Domain`` ()

   Remove a percent sign ``%`` , in :ref:`CppAD_vector-name` , in the text

      # ``include <cppad/utility/vector.hpp>``

07-25
=====

#. Fix warnings related to type conversions that
   occurred when one used ``-Wconversion`` with
   ``g++`` version 6.3.1.
#. The warning were not fixed for complex AD types; e.g.,
   :ref:`complex_poly.cpp-name` .
   The :ref:`wno_conversion-name` include file was added to deal with
   cases like this.

07-03
=====

#. The :ref:`min_nso_linear-name` abs-normal example was added.
#. Fix bug in :ref:`abs_normal_fun-name` , to be specific, the multiplication
   of a variable on the left by a parameter was not handled.

07-01
=====
the :ref:`abs_normal<example_abs_normal-name>` examples were converted from using
quadratic programming problems to using linear programming problems.

06-28
=====
The :ref:`abs-normal<abs_normal_fun-name>`
representation of non-smooth functions has been added.
Examples and utilities that use this representation have also been included,
see :ref:`abs_normal<example_abs_normal-name>` .

06-11
=====
The atomic functions base class :ref:`atomic_two-name`
makes more of an effort to avoid false sharing cache misses.
This may the speed of multi-threaded applications with atomic functions;
e.g., see :ref:`multi_atomic_two.cpp-name` .

06-10
=====

#. Add the multi-threading atomic function example
   :ref:`multi_atomic_two.cpp-name` .
#. The ``example/multi_thread/test_multi`` directory used
   to have an example using the deprecated
   :ref:`atomic_one-name` functions in a multi-threading setting
   (that only built with the deprecated :ref:`configure-name` ).
   This have been removed.

06-07
=====
The multi-threading examples
:ref:`harmonic.cpp-name` and :ref:`multi_newton.cpp-name` were re-organized.
To be specific, the source code for each example was moved to one file.
In addition, for each example,
the documentation for each of the routines has been separated
and placed next to its source code.

06-04
=====
Most all the :ref:`deprecated-name` features have been removed
from the examples with the exception of those in the
``example/deprecated`` directory.

06-03
=====
Add the fact that the pair
( *row* , :ref:`link_sparse_hessian@col` )
is lower triangular to the speed test
``link_sparse_hessian`` routine.

06-01
=====

#. There was a bug in the
   :ref:`sparse_hes-name` routine and it was using the general coloring algorithm when
   :ref:`sparse_hes@coloring@cppad.symmetric` was specified.
   This has been fixed and improves the efficiency in this case.
#. Some bugs were fixed in the use of
   :ref:`colpack<colpack_prefix-name>` as the coloring algorithm for
   sparse Jacobian and Hessian calculations.
   This has improved the efficiency of Colpack colorings for computing Hessians
   (when ``colpack.symmetric`` is used).
#. The ``colpack.star`` coloring method for sparse Hessians has
   been deprecated; see
   :ref:`sparse_hes<sparse_hes@coloring@colpack.star Deprecated 2017-06-01>`
   and
   :ref:`sparse_hessian<sparse_hessian@work@colpack.star Deprecated 2017-06-01>` .
   Use the ``colpack.symmetric`` method instead; see
   :ref:`sparse_hes<sparse_hes@coloring@colpack.symmetric>` and
   :ref:`sparse_hes<sparse_hes@coloring@colpack.general>` .

05-29
=====

#. Add the capability to compile so that CppAD debug and release mode
   can be mixed using ``CPPAD_DEBUG_AND_RELEASE`` .
#. Add the :ref:`cmake@cppad_debug_which` flags
   that determines which files are compiled for debugging versus release
   during the CppAD testing; see :ref:`cmake_check-name` .
#. There was a problem linking the proper libraries for using newer versions of
   :ref:`sacado<sacado_prefix-name>` .
   This has been fixed.

05-19
=====
Most all the examples have been moved to ``example`` directory
and grouped as sub-directories; e.g., the :ref:`ipopt_solve-name` examples
are in the ``example/ipopt_solve`` directory.

05-14
=====

#. The file ``build.sh`` was moved to ``bin/autotools.sh`` ,
   and `auto tools' has been changed to :ref:`configure-name` .
#. The README file was replace by readme.md
   and AUTHORS was moved to authors.
#. The NEWS, INSALL, and ChangeLog files
   are no longer necessary for autotools build and have been removed.
#. The file test_more/sparse_jacobian.cpp generated a warning
   under some gcc compiler options.
   This has been fixed.
#. Specifications were added so that :ref:`to_string-name` yields exact results
   for integer types and machine precision for floating point types.
#. Some editing was done to the :ref:`configure-name` instructions.

05-12
=====

#. The :ref:`Faq-name` has been updated.
#. Remove includes of ``cppad/cppad.hpp`` from the
   ``include/cppad/speed/`` * . ``hpp`` files.
   This avoids an incompatibility between sacado and newer versions of eigen,
   when eigen is used for the :ref:`testvector-name` .
#. The :ref:`eigen-name` package changed its requirements for
   defining Scalar types
   (some where between eigen-3.2.9 and eigen-3.3.3).
   The member variable
   :ref:`digit10<numeric_limits@digits10>` was added to the
   ``numeric_limits`` to accommodate this change.
#. Note that this fix required adding ``digits10`` to the
   user defined *Base* type
   :ref:`requirements<base_require-name>` ; see
   :ref:`base_limits-name` .
#. In addition, it is no longer necessary to add the typedef

      ``typedef Scalar value_type`` ;

   so the file ``cppad/example/eigen_plugin.hpp`` has been removed.
   (This type definition was previously necessary for eigen vectors
   to be :ref:`simple vectors<SimpleVector-name>` .)

04-08
=====
The :ref:`optimization<optimize-name>` , with a large number of
:ref:`conditional expressions<CondExp-name>` , was performing many
memory allocations and deallocations. This has been reduced.

04-02
=====
Fix a bug in the optimization of conditional expressions; see,
:ref:`optimize@options@no_conditional_skip` .

03-31
=====
Fix some ``valgrind`` errors that occurred while running the CppAD
test set.

03-29
=====
The following valgrind error might occur when the optimize skipped
setting values that did not affect the dependent variables:

   ``Conditional jump or move depends on uninitialised value`` ( ``s`` )

This was not a bug, the code has been changed to avoid this error
in order to make it easier to use valgrind with CppAD.

03-25
=====

#. The :ref:`sparse_hes-name` function was more efficient if
   there were more entries in each row of the requested
   :ref:`sparse_hes@subset` . This has been changed
   to more entries in each column, and documentation to this effect
   was included.
#. The :ref:`optimize-name` routine was using to much memory when
   it was optimizing conditional skip operations; see
   :ref:`optimize@options@no_conditional_skip` .
   This has been fixed.

03-20
=====
There was a mistake in :ref:`sparse_jac-name` that caused the
following assert to mistakenly occur:
::

   sparse_jac_rev: work is non-empty and conditions have changed
   Error detected by false result for
   color.size() == 0 || color.size() == n

A test that using a previously stores work vector
has been added to :ref:`sparse_jac_rev.cpp-name`
and this bug has been fixed.

03-13
=====
The documentation for the Hessian in :ref:`rev_hes_sparsity-name` was
transposed; i.e., the sense of
:ref:`rev_hes_sparsity@transpose` was reversed.

03-11
=====
Add sparse assignment statements; see *other* for
:ref:`sparse_rc<sparse_rc@other@Assignment and Constructor>` and
:ref:`sparse_rcv<sparse_rcv@other@Assignment and Constructor>` .
03-10
=====
Add the a sizing constructor to the
:ref:`sparse_rc syntax<sparse_rc@Syntax>` ; i.e.,
a constructor that sets the number of row, number of columns,
and number of possibly non-zero values in the sparsity pattern.

03-06
=====
Fix a bug in the sparsity computation using the
internal representation for
:ref:`vectors of sets<glossary@Sparsity Pattern@Vector of Sets>` ;
i.e., when *internal_bool* was false in
any of the :ref:`sparsity_pattern-name` calculations; e.g.,
:ref:`for_jac_sparsity<for_jac_sparsity@internal_bool>` .

03-04
=====
Fix a bug in the optimization of conditional expressions;
see :ref:`optimize@options@no_conditional_skip` .

02-26
=====

#. Fix warning during :ref:`cmake-name` command,
   on `cygwin <https://www.cygwin.com/>`_ systems,
   about ``WIN32`` not being defined.
#. Add element-wise atomic operations to the wish list.
   This was completed by the :ref:`atomic_four_vector-name` example.

02-21
=====

#. Minor improvements to syntax and documentation for
   :ref:`sparse_rc-name` and :ref:`sparse_rcv-name` .
#. Separate preferred sparsity versions in
   :ref:`sparsity_pattern-name` and :ref:`sparse_derivative-name` .

02-19
=====

#. Remove the ``bool_sparsity.cpp`` example and
   add the :ref:`rc_sparsity.cpp-name` example.
#. Check for duplicate entries during
   :ref:`sparse_rc@row_major` and ``col_major`` in
   ``sparse_rc`` .

02-15
=====
Fix bug when using :ref:`ForSparseHes-name` with atomic functions; i.e.,
:ref:`atomic_two_for_sparse_hes-name` .

02-13
=====
Improve :ref:`atomic_two_eigen_mat_mul.hpp@Private@for_sparse_jac`
calculation in ``eigen_mat_mul.hpp`` example.
It now checks for the parameter zero and does not propagate any sparsity
in this case (because the result is always zero).

02-11
=====

#. Remove the 'Under Construction' heading from the
   :ref:`sparse_rc-name` and :ref:`sparse_rcv-name` documentation; i.e.,
   they are ready for public use (part of the CppAD API).
#. Fix some warning that occur when using
   :ref:`cppad_testvector@eigen` for the CppAD test vector.
   (The Eigen vector ``size()`` function
   returns an ``int`` instead of ``size_t`` .)
#. Fix a bug in :ref:`sparse_jac_rev<sparse_jac-name>` .

02-10
=====

#. The subset of deprecated features corresponding to
   the cmake command option ``cppad_deprecated=YES``
   have been completely removed.
#. Fix problems with :ref:`configure-name` build
   (started near 02-01 while working on sparsity branch).
#. Reorder (better organize) the :ref:`ADFun-name` documentation section.

02-09
=====

#. Remove the sparsity pattern wish list item.
   For sparsity patterns, this was completed by
   :ref:`sparse_rc-name` and the sparsity pattern routines that used it;
   e.g., :ref:`for_jac_sparsity-name` .
   For sparse matrices, it was completed by
   :ref:`sparse_rcv-name` and the sparse matrix routines that use it; e.g.,
   :ref:`sparse_jac-name` .
#. Add the Deprecated and
   :ref:`wish_list@Example` items to the wish list.
   (The Deprecated item was partially completed and partially removed.)

02-08
=====

#. Make coloring a separate argument to
   :ref:`sparse_jac<sparse_jac@coloring>` and
   :ref:`sparse_hes<sparse_hes@coloring>` .
#. Add the
   :ref:`sparse_jac@group_max`
   argument to the ``sparse_jac_for`` function.

02-05
=====

#. Add the :ref:`sparse_jac_for<sparse_jac-name>` routine
   which uses :ref:`sparse_rc-name` sparsity patterns
   and :ref:`sparse_rcv-name` matrix subsets.
#. Order for :ref:`sparse_rc-name` row-major and column-major was switched.
   This has been fixed.

02-03
=====
Add the
:ref:`rev_jac_sparsity-name`
:ref:`rev_hes_sparsity-name` , and
:ref:`for_hes_sparsity-name` interfaces to sparsity calculations.
These use :ref:`sparse_rc-name` sparsity patterns.

02-02
=====
Change :ref:`for_jac_sparsity@f@size_forward_bool` and
Change :ref:`for_jac_sparsity@f@size_forward_set`
so that they are a better approximation of the number of bytes
(unsigned characters) being used.
The exact same sparsity pattern might use different memory
in two different function objects (because memory is allocated in chunks).
The :ref:`fun_assign.cpp-name` example has been changed to reflect this fact.

02-01
=====
Add the :ref:`for_jac_sparsity-name` interface for the sparse Jacobian calculations.
This is the first use of :ref:`sparse_rc-name` ,
a sparsity pattern class that uses row and column
:ref:`index vectors<glossary@Sparsity Pattern@Row and Column Index Vectors>` .

01-30
=====
Move the :ref:`sparsity_pattern-name` examples from ``example``
to ``example/sparse`` subdirectory.
This included the sparse :ref:`driver<drivers-name>` examples.

01-29
=====
Move the :ref:`utility-name` examples from ``example``
to ``example/utility`` subdirectory.

01-27
=====
Add a :ref:`addon-name` link to
`cppad_swig <http://www.seanet.com/~bradbell/cppad_swig>`_,
a C++ AD object library and swig interface to Perl, Octave, and Python.

01-19
=====
Convert more examples / tests to use a multiple of machine epsilon
instead of ``1e-10`` .

01-18
=====

#. Fix developer
   `doxydoc <https://www.coin-or.org/CppAD/Doc/doxydoc/html/>`_
   documentation so that it works with newer version of doxygen.
#. Fix a Visual C++ 2015 compilation problem in friend declarations
   in the file ``cppad/local/ad_tape.hpp`` .

01-17
=====
Change computed assignment to
:ref:`compound assignment<compound_assign-name>` .

{xrst_end whats_new_17}
