Prev Next whats_new_09

@(@\newcommand{\W}[1]{ \; #1 \; } \newcommand{\R}[1]{ {\rm #1} } \newcommand{\B}[1]{ {\bf #1} } \newcommand{\D}[2]{ \frac{\partial #1}{\partial #2} } \newcommand{\DD}[3]{ \frac{\partial^2 #1}{\partial #2 \partial #3} } \newcommand{\Dpow}[2]{ \frac{\partial^{#1}}{\partial {#2}^{#1}} } \newcommand{\dpow}[2]{ \frac{ {\rm d}^{#1}}{{\rm d}\, {#2}^{#1}} }@)@
Changes and Additions to CppAD During 2009

This section contains a list of the changes to CppAD during 2009 (in reverse order by date). The purpose of this section is to assist you in learning about changes between various versions of CppAD. (Comments about developer documentation are only important if you are trying to read and understand the CppAD source code.)

The ADFun assignment operator was changed so that it now copies forward mode Taylor coefficients and sparsity pattern information. (This assignment operator was added on 10-24 .) You can use capacity_order to delete the Taylor coefficients before copying them. Two new functions were added so that you can query and delete the forward mode sparsity information; see size_forward_bool and size_forward_set .

Convert the optimization of a sequence of additions from multiple operators to one operator with a varying number of arguments. This improved the speed for forward and reverse mode computations of an optimized tape.

It turns out that detection of a sequence of additions makes the optimization longer. This was simplified and makes slightly faster by converting two jointly recursive routines to one non-recursive routine that uses a stack for the necessary information. More work is planned to make this optimization faster.

Detection of a sequence of additions that can be converted to one variable during the optimize process. This leads to a significant improvement in the tape size and speed.

Change hash coding of parameter values as part of operators during the optimize process. This should leads to more detection and removal of duplicate operations.

Fix minor grammatical error in the Purpose heading for conditional expressions .

Add the following functions: size_op , size_op_arg , and size_op_seq . In addition, improve and extend the seq_property.cpp example.

Fix bug in tape optimization with VecAD objects.

Remove duplicate expressions for the commutative binary operators; i.e., addition and multiplication.

Improve optimize command so that it removes some duplicate expressions from the tape (more of this is planned).

Make program that check Ipopt ODE example correctness a separate file ipopt_nlp_ode_check.cpp Split out Ipopt driver for ODE example ipopt_nlp_ode_run.hpp . Add the speed testing problem ipopt_cppad/ipopt_ode_speed.cpp.

Split out the ode inverse problem , its simple representation , and its fast representation , as a separate files; to be specific, ipopt_nlp_ode_problem.hpp , ipopt_nlp_ode_simple.hpp , ipopt_nlp_ode_fast.hpp , and ipopt_nlp_ode_check.cpp .

Improve the documentation for ipopt_nlp_ode_simple and ipopt_nlp_ode_fast .

Moved old ipopt_cppad_simple.cpp to ipopt_nlp_get_started.cpp , created the example ipopt_nlp_ode_simple.hpp , and split and ipopt_cppad_ode.cpp into ipopt_nlp_ode_fast.hpp and ipopt_nlp_ode_check.cpp .

Added the assignment operator to the ADFun object class. This makes a copy of the entire operation sequence in another function object. The intention is that the two functions objects can do calculations in parallel. In addition, CppAD now check for the ADFun copy constructor and generates an error message if it is used.

The sparse_hessian routine was extended so the user can now choose between vectors of sets and boolean vectors for representing sparsity patterns .

The CheckSimpleVector function was extended so that it can check simple vectors where the elements of the vector can not be assigned to integer values. This was done by adding the x, y arguments to CheckSimpleVector.

The sparse_jacobian routine was extended so the user can now choose between vectors of sets and boolean vectors for representing sparsity patterns .

The packed parameter for the sparsity routines ForSparseJac , RevSparseJac , and RevSparseHes (introduced on 09-26 ) has been removed. It has been replaced by changing the argument and return values to be more versatile. To be specific, they can now represent sparsity using vectors of std::set<size_t> instead of just as vectors of bool (see sparsity patterns ).

The Microsoft Visual Studio project files for examples and testing and for more correctness testing were not including some new tests in their builds. This has been fixed.

Added the cppad_sparse_jacobian.cpp speed test and increased the sizes used by link_sparse_hessian . Some mistakes were fixed in the documentation for speed tests link_sparse_hessian and sparse_hes_fun .

The documentation definition of the function @(@ H(x) @)@ in RevSparseHes was missing a factor of @(@ R @)@. This has been fixed.

Changed RevSparseHes so that it uses a sparse representation when the corresponding call to ForSparseJac used a sparse representation. This should have been included with the change on 09-26 because Hessian sparsity patters after ForSparseJac with packed did not work. Thus, this could be considered a bug fix.

Added the packed parameter to ForSparseJac and RevSparseJac . If packed is false, a sparse instead of packed representation is used during the calculations of sparsity patterns. The sparse representation should be faster, and use less memory, for very large sparse Jacobians. The functions ForSparseJac and RevSparseJac return packed representations. The plan is to eventually provide new member functions that return sparse representations.

Fixed a bug in the Hessian Sparsity calculations that included use of VecAD objects.

Some more memory allocation improvements (related to those on 09-18) were made.

A bug was found in all the sparsity_pattern calculations. The result was that eight times the necessary memory was being used during these calculations. This has been fixed.

Add ad_fun.cpp an example of how to create your own interface to an ADFun object.

Add ad_in_c.cpp an example of how to link CppAD to other languages.

Add an option to optimize an operation sequence.

Begin Merge
of changes from the directory branches/optimize in the CppAD subversion repository. The subheading dates below represent when the correspond change was made in branches/optimize.

An automatic check of the forward_zero results was added after each call to f.optimize() (this check is skipped when NDEBUG is defined). In addition, all of the speed/cppad/*.cpp tests now check and use the speed test optimize flag.

Change the speed test main program so that it uses a list of options instead of a boolean flag for each option. This will make it possible to add options in the future with out having to change all the existing tests because the options are now global variables instead of arguments to the speed test routines; for example, see retape speed test option.

The routine for optimizing the operation sequence has been added has been further tested using test_more/optimize.cpp. Some bugs have been fix and the routine can now be trusted to work correctly.

The function size_VecAD function was added so that the user could see the VecAD vectors and elements corresponding to an operation sequence.

A routine for optimizing the operation sequence has been added. This is a preliminary version and needs more testing before it can be trusted to work correctly.
End Merge

Add hash table coding to reduce the number of copies of the same parameter value necessary in a tape recording. In addition, add the function size_par was added so that the user could see the number of parameters corresponding to an operation sequence.

Fix bug in new version of how ForSparseJac handles VecAD objects.

Fix bug in overnight build where HTML version and entire documentation as one page versions of documentation were not being built.

Fix missing new line under Using Value heading for simple vector documentation.

Fix bug in reverse mode Jacobian sparsity for VecAD objects.

The forward and reverse sparse Jacobian routines have been improved so the resulting sparsity patterns are valid for all values of the independent variables (even if you use CondExp or VecAD ).

Convert developer documentation from forward and reverse mode sweep routines from OMhelp to doxygen.

Add developer documentation for PrintFor operations.

Add developer documentation for Discrete operations.

Add developer documentation for tape evaluation of VecAD store operations. (a store operation changes the value of a VecAD element).

Improve the vec_ad.cpp user example.

Fixed a bug in second or higher order reverse mode calculations that used VecAD . This bug was demonstrated by the test case SecondOrderReverse in the file test_more/vec_ad.cpp.

Add developer documentation for tape evaluation of the VecAD load operations (a load operation accesses an element of the vector but does not change it.)

Fix isnan undefined in example/cond_exp.cpp error introduced on 07-04 change.

Add developer documentation for the CompareChange operations during tape evaluation.

Begin Merge
of changes from the directory branches/sweep in the CppAD subversion repository. The subheading dates below represent when the correspond change was made in branches/sweep.

Fixed a bug in second or higher order reverse mode calculations that included conditional expressions . This bug was demonstrated by the test case SecondOrderReverse in the file test_more/cond_exp.cpp.

A simpler and useful example was provided for conditional expressions ; see cond_exp.cpp .

Some minor improvements were made to the documentation for CondExp . To be specific, a newer OMhelp option was used to change the formatting of the syntax, some of the argument names were changed to be more descriptive.

Add developer doxygen documentation of tape evaluation for power (exponentiation) operators.

Fix an example indexing error in introduction/exp_apx/exp_eps_for2.cpp (found by valgrind).

Add developer doxygen documentation of tape evaluation for multiplication and division operators.

Add developer doxygen documentation of tape evaluation for addition and subtraction operators.

Add developer doxygen documentation of tape evaluation for sin, sinh, cos, and cosh.

Add developer doxygen documentation of tape evaluation for atan, asin, acos, sqrt, log.
End Merge

The tarball for most recent release (of the subversion trunk for CppAD) was not being placed in the download directory. This has been fixed.

Fix compiler warnings during the openmp/ test.

Changed speed_example.cpp to omit the speed_test from the correctness result. In stead, a message is printed explaining that timing tests need to be run without a lot of other demands on the system.

The configure instructions for ipopt_dir had the wrong path for IpIpoptApplication.hpp. This has been fixed.

Upgrade to from autoconf 2.61 to 2.63, and from automake 1.10.1 to 1.11.

Fix conflict between CppAD's use of config.h preprocessor symbols and other packages use of the same symbol names.

  1. Using complex of an AD type (instead of AD of complex) was not working correctly in not_complex_ad.cpp because the default constructor for an AD object has an unspecified value. This has been fixed for the complex type by changing the default constructor to use value zero. (The not_complex_ad.cpp example has been removed; see complex FAQ .)
  2. Fixing the not_complex_ad.cpp problem above also fixed a warning generated by valgrind . Now valgrind runs the CppAD example/example program with out any warning or error messages. In addition, a minor initialization error was fixed in the test_more/jacobian.cpp routine so now valgrind also runs the CppAD test_more/test_more program with out any warnings or error messages.

A change was make to the trunk on 05-19 (svn revision 1361) that broke the Unix install procedure. This was has been fixed (revision 1362).

Added cross references in the examples to occurrence of the following tokens: AD , ADFun , CPPAD_TEST_VECTOR , Forward , Independent , Jacobian NearEqual , Reverse .

Demonstrate using AD to compute the derivative of the solution of an ODE with respect to a parameter (in the runge45_2.cpp example).

Change the distribution compressed tar file to only contain one copy of the documentation. Link to the current Internet documentation for the other three copies.

Move the Prev and Next buttons at the top of the documentation to the beginning so that their position does not change between sections. This makes it easier to repeatedly select this links.

Modify cppad/local/op_code.hpp to avoid incorrect warning by g++ version 4.3.2 when building pycppad (a python interface to CppAD).

Sometimes an error occurs while taping AD operations. The abort_recording function has been added to make it easier to recover in such cases.

Previously, CppAD speed and comparison tests used Adolc-1.10.2. The version used in the tests has been upgraded to Adolc-2.0.0.

A discussion has been added to the documentation for Jacobian about its use of forward or reverse mode depending on which it estimates is more efficient.

A minor typo has been fixed in the description of W(t, u) in reverse_any . To be specific, @(@ o ( t^{p-1} ) * t^{1-p} \rightarrow 0 @)@ has been replaced by @(@ o ( t^{p-1} ) / t^{1-p} \rightarrow 0 @)@.

Made some minor improvements to the documentation in FunConstruct .
Input File: omh/appendix/whats_new/whats_new_09.omh