# 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_08 app}
{xrst_spell
   differentiable
   fg
   scalars
   specializations
   speedtest
   subregions
   tanh
   tarballs
}

Changes and Additions to CppAD During 2008
##########################################

mm-dd
*****

12-19
=====
In the documentation for :ref:`pow_int-name` change the integer exponent
from ``int`` *y* to ``const int &`` *y* .
In the implementation for :ref:`pow-name` make the integer base case
agree with the documentation; i.e., change
from ``int`` *x* to ``const int &`` *x* .

12-14
=====
Added another test of :ref:`mul_level-name` calculations (in the
``test_more`` directory).

12-04
=====
Extensive explanation for the ``ipopt_cppad/ipopt_cppad_ode`` example was
provided in the section ipopt_cppad_ode.

11-22
=====
The CppAD interface to the Ipopt nonlinear programming solver
:ref:`cppad_ipopt_nlp-name`
has been moved from ``example/ipopt_cppad_nlp`` to
``ipopt_cppad/ipopt_cppad_nlp`` .

11-21
=====
The Microsoft's Visual C++ Version 9.0 generates a warning of the form
``warning C4396:`` %...%
for every template function that is declared as a both a friend and inline
(it thinks it is only doing this for specializations of template functions).
The warnings are no longer generated because
these ``inline`` directives are converted to
empty code when a Microsoft Visual C++ is used.

11-20
=====
The function ``tanh`` ( *x* ) was added to the
:ref:`unary_standard_math-name` functions.
The ``abs`` and ``erf`` functions were removed from the
:ref:`Base requirements<base_require-name>` .
The restrictions about the Base class were removed from
:ref:`abs-name` , :ref:`atan2-name` , :ref:`LuRatio-name` , :ref:`erf-name` .

Visual Studio Version 9.0 could not handle the large number of static
constants in the CppAD :ref:`erf-name` function.
This function was changed to a simpler representation
that is much faster and that
is differentiable at all points (not defined differently on subregions).
The down side to this is that the new version
is not as accurate.

10-27
=====
Change prototypes for ``ipopt_cppad/ipopt_cppad_ode`` helper routines
to use ``const`` (where appropriate).

10-17
=====
Major improvements to the ``ipopt_cppad/ipopt_cppad_ode`` example.

10-16
=====
Minor improvement to description of optimization argument in
``ipopt_cppad/ipopt_cppad_ode`` .

09-30
=====
Add or modify some wish list entries; see
``cppad_ipopt_nlp`` (since removed),
multiple argument forward (completed with :ref:`forward_dir-name` ),
and sparsity patterns
(:ref:`sparsity patterns<glossary@Sparsity Pattern>` has been fulfilled).

09-26
=====
Use parenthesis and brackets to group terms of the form
:math:`m \times I` to make the documentation of
:ref:`cppad_ipopt_nlp-name` easier to read.

Changed ``ipopt_cppad/ipopt_cppad_ode`` to use :math:`y(t)` for
the solution of the ODE to distinguish it for :math:`x`,
the vector we are optimizing with respect to.

09-18
=====
Changed ``ipopt_cppad/ipopt_cppad_ode`` to a case where :math:`x(t)`
is a pair of exponential functions instead of a linear and quadratic.
Fixed some of the comments in this example and included the source
code in the documentation (which was missing by mistake).

09-17
=====
Changed ``ipopt_cppad/ipopt_cppad_ode`` to a case where there are
two components in the ODE (instead of one).
Also removed an initialization section that was only intended for tests
with a specific initial value.

09-16
=====
Add ``ipopt_cppad/ipopt_cppad_ode`` , an example and test
that optimizes the solution of an ODE.
Change ``r_eval`` to ``eval_r`` in :ref:`cppad_ipopt_nlp-name` .
Fix a dimension of ``u_ad`` error in ``ipopt_cppad_nlp`` .

09-12
=====
Converted from storing full Hessian and Jacobian to a sparse data structure
in :ref:`cppad_ipopt_nlp-name` .
This greatly reduced the memory requirements (and increased the speed)
for sparse problems.

09-10
=====
Fixed more indexing bugs in :ref:`cppad_ipopt_nlp-name`
that effected cases where the domain index vector :math:`J_{k, \ell}`
was different for different values of :math:`k` and :math:`\ell`.

In :ref:`cppad_ipopt_nlp-name` ,
combined *fg_info* ``->domain_index`` () and
*fg_info* ``->range_index`` () into a single function called
*fg_info* ``->index`` () .
Also added more error checking (if ``NDEBUG`` is not defined).

09-09
=====
Fixed an indexing bug in :ref:`cppad_ipopt_nlp-name` .
(This effected cases where the domain index vector :math:`J_{k, \ell}`
was different for different values of :math:`k` and :math:`\ell`.)

09-07
=====
Change :ref:`cppad_ipopt_nlp-name` so that object and constraints
are expressed as the double summation of simpler functions.
This is more versatile that the single summation representation.

09-06
=====
Checked in a major change to :ref:`cppad_ipopt_nlp-name`
whereby the object and constraints can be expressed as the
sum of simpler functions.
This is the first step in what will eventually be a more versatile
representation.

09-05
=====
Fix bug in :ref:`cppad_ipopt_nlp-name` (not recording the function
at the proper location. Here is the difference that occurred
multiple places in the ``ipopt_cppad/ipopt_cppad_nlp.cpp`` source:
::

   for(j = 0; j < n_; j++)
   -       x_ad_vec[0] = x[j];
   +       x_ad_vec[j] = x[j];

This did not show up in testing because there currently is no test of
``ipopt_cppad_nlp`` where the operation sequence depends
on the value of :math:`x`.

Changed ``eval_grad_f`` in ``ipopt_cppad_nlp.cpp``
to be more efficient.

09-04
=====
The :ref:`cppad_ipopt_nlp-name` interface has been changed to use
a derived class object instead of a pointer to a function.

09-03
=====
The :ref:`cppad_ipopt_nlp-name` interface has been changed to use
``size_t`` instead of ``Ipopt::Index`` .

09-01
=====
Back out the changes made to :ref:`cppad_ipopt_nlp-name` on 08-29
(because testing proved the change to be less efficient in the case
that motivated the change).

08-29
=====
The ``push_vector`` member function was missing from the
:ref:`Cppad_vector@vectorBool` class.
This has been fixed.
In addition, it seems that for some cases (or compilers)
the assignment

   *x* [ *i* ] = *y* [ *j* ]

did not work properly when both *x* and *y*
had type ``vectorBool`` .
This has been fixed.

The :ref:`cppad_ipopt_nlp-name` example has been extended
so that it allows for both scalar and vector evaluation of the
objective and constraints; see the argument *fg_vector* in
:ref:`cppad_ipopt_nlp-name` .
In the case where there is not a lot of common terms
between the functions, the scalar evaluation may be more efficient.

08-19
=====
Add :ref:`push of a vector<CppAD_vector@push_vector>`
to the ``CppAD::vector`` template class.
This makes it easy to accumulate multiple scalars and
:ref:`simple vectors<SimpleVector-name>` into one large ``CppAD::vector`` .

08-08
=====
There was an indexing bug in the
:ref:`cppad_ipopt_nlp-name` example
that affected the *retape* equal to ``false`` case.
This has been fixed.
In addition, the missing
*retape* documentation was added.

07-02
=====
Extend :ref:`configure@Configure` command to check for
extras libraries that are necessary for linking the ipopt example.

06-18
=====
Add specifications for the Ipopt class :ref:`cppad_ipopt_nlp-name` .
This is only an example class it may change with future
versions of CppAD.

06-15
=====
The nonlinear programming example ``ipopt_nlp_get_started.cpp`` was added.
This is a preliminary version of this example.

06-11
=====
The sparsity pattern for the Hessian was being calculated each time
by :ref:`SparseHessian<sparse_hessian-name>` .
This is not efficient
when the pattern does not change between calls to ``SparseHessian`` .
An optional sparsity pattern argument was added to ``SparseHessian``
so that it need not be recalculated each time.

06-10
=====
The sparsity pattern for the Jacobian was being calculated each time
by :ref:`SparseJacobian<sparse_jacobian-name>` .
This is not efficient
when the pattern does not change between calls to ``SparseJacobian`` .
An optional sparsity pattern argument was added to ``SparseJacobian``
so that it need not be recalculated each time.

05-08
=====
The :ref:`sparse_jacobian-name` routine has been added.

The example in :ref:`sparse_hessian-name` pointed to :ref:`hessian.cpp-name`
instead of :ref:`sparse_hessian.cpp-name` .
This has been fixed.

05-03
=====
The ``retape`` flag has been added to :ref:`speed_main-name` .
In addition the routines
:ref:`link_det_minor-name` , :ref:`link_poly-name` , and :ref:`link_ode-name`
pass this flag along to the speed test implementations
(because the corresponding tests have a fixed operation sequence).
If this flag is false, a test implementation is allowed to just tape
the operation sequence once and reuse it.
The following tests use this flag:
:ref:`adolc_det_minor.cpp-name` ,
:ref:`cppad_det_minor.cpp-name` ,
:ref:`cppad_ode.cpp-name` ,
:ref:`adolc_poly.cpp-name` ,
:ref:`cppad_poly.cpp-name` .

Create specialized zero order forward mode routine that should be faster,
but does not test out as faster under cygwin g++ (GCC) 3.4.4.

04-20
=====
Added the :ref:`ode_evaluate-name` speed test utility in
preparation for having ode speed tests.
Created ode speed test for the ``cppad`` and ``double``
cases; see :ref:`speed_main-name` .
In addition,
added the examples :ref:`ode_evaluate.cpp-name` and :ref:`sparse_hessian.cpp-name` .

Changed the :ref:`speed_main-name` routines defined for each package
from ``compute_`` *name* to ``link_`` *name* .
For example, in ``speed/cppad/det_minor.cpp`` ,
the function name
``compute_det_minor`` was changed to ``link_det_minor`` .

04-18
=====
Fix a problem in the :ref:`link_poly-name` correctness test.
Also add :ref:`double_sparse_hessian.cpp-name` to the set
speed and correctness tests (now available).

04-10
=====
Change all the
:ref:`Adolc speed<speed_adolc-name>` examples to use
:ref:`track_new_del-name` instead of using ``new`` and ``delete``
directly.
This makes it easy to check for memory allocation errors and leaks
(when ``NDEBUG`` is not defined).
Also include in documentation sub functions that indicate
the ``sparse_hessian`` speed test is not available for
:ref:`double_sparse_hessian.cpp-name` ,
:ref:`fadbad_sparse_hessian.cpp-name` , and
:ref:`sacado_sparse_hessian.cpp-name` .

04-06
=====
The following :ref:`wish list<wish_list-name>`
entry has been completed and removed from the list:
"Change private member variables names
(not part of the user interface)
so that they all end with an underscore."

04-04
=====
Fix a problem compiling the speed test
:ref:`main<speed_main-name>` program with gcc 4.3.

03-27
=====
Corrected :ref:`cppad_sparse_hessian.cpp-name`
so that it uses the sparse case when
``USE_CPPAD_SPARSE_HESSIAN`` is ``1`` .
Also added a wish list sparsity pattern entry
(the :ref:`glossary@Sparsity Pattern` entry
has been fulfilled).

Change the name of ``speedtest.cpp`` to :ref:`speed_program.cpp-name` .

02-05
=====
Change windows install instructions
to use Unix formatted files (so only two instead of
four tarballs are necessary for each version).
The Microsoft project files for
``speed/cppad`` , ``speed/double`` , and ``speed/example``
were missing. This has also been fixed.

02-03
=====
There was an ambiguity problem
(detected by g++ 4.3) with the following operations

   *x* *op* *y*

where *x* and *y* were ``AD<double>`` and
*op* was a member operator of that class.
This has been fixed by making all such member functions friends
instead of members of ``AD<double>`` .

Remove compound assignment entry from wish list
(it was fixed on :ref:`2007-05-26<whats_new_07@mm-dd@05-26>` ).
Add an expression hashing entry to the :ref:`wish_list-name`
(it has since been removed).
Add Library and Scripting Languages to the wish list
(this has since been fulfilled by the example :ref:`ad_in_c.cpp-name` ).

01-26
=====
The :ref:`LuFactor-name` routine gave a misleading error message
when the input matrix had not a number or infinity in it.
This has been fixed.

01-24
=====
The :ref:`configure@postfix_dir`
has been added to the ``configure`` command line options.

01-21
=====
A sparse Hessian case was added to the :ref:`speed-name` tests; see
:ref:`sparse_hessian<link_sparse_hessian-name>` .

01-20
=====
CppAD can now be installed using ``yum`` on
``Fedora`` operating systems.

01-11
=====
The CppAD correctness tests assume that machine epsilon is less
than ``1e-13`` . A test for this has been added to the
``test_more/test_more`` program.

01-08
=====
Added a :ref:`sparse_hessian-name` routine and
extended :ref:`Hessian-name` to allow for a weight vector *w*
instead of just one component *l* .

{xrst_end whats_new_08}
