Prev Next whats_new_16

@(@\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 2016

The sections listed below contain a list of the changes to CppAD in reverse order by date. The purpose of these sections is to assist you in learning about changes between various versions of CppAD.

Added a way for the user to determine what tests options are available; see make check .

Change the optimize examples to use NearEqual for floating point tests (instead of exactly equal). There were some other exactly equal floating point tests that were failing on a mingw system. Theses have also been fixed.

Add the no_print_for_op to the optimize routine.

  1. Fix a bug in ForSparseHes . To be more specific, there was a bug in handling the cumulative summations operator in this routine. This could only come up when used an optimized f ,
  2. Add the nest_conditional.cpp example.

Improve the optimize documentation. This includes making examples that demonstrate specific aspects of the optimization; see forward_active.cpp , reverse_active.cpp , compare_op.cpp , conditional_skip.cpp , cumulative_sum.cpp .

The options argument was added to the optimize routine.

Move classes and functions that are part of the user API from the cppad/local directory to the cppad/core directory. The remaining symbols, in the cppad/local directory, are now in the CppAD::local namespace. Note that a class in the CppAD name space, may have a member function that is not part of the user API.

Increase the speed of the sparse_pack class. This improves the speed for vector of boolean sparsity pattern calculations.

Merged in the sparse branch which has const_iterator, instead of next_element for the sparse_list and sparse_pack classes. These classes are not part of the CppAD API and hence their specifications can change (as in this case). They can be used to get more efficient representations of sparsity patterns .

The optional optimize option was added to the checkpoint functions.

  1. Change elapsed_seconds to use std::chrono::steady_clock instead of std::chrono::high_resolution_clock.
  2. The test for C++11 features was failing on a Mac system because the elapsed time was returning as zero (between two events). This test has been made more robust by add a one millisecond sleep between the two clock accesses.

The multiple directions version of forward was missing erf function in the case where C++ 2011 was supported; see issue 16 . This has been fixed.

Change the implementation of atomic_eigen_cholesky.hpp so that the computation of @(@ M_k @)@ exactly agrees with the corresponding theory .

  1. A possible bug in the optimize command was fixed. To be specific, a warning of the form indentations;
         warning: this 'if' clause does not guard... [-Wmisleading-indentation]
    using the gcc-6.2.1 compiler, was fixed and it may have fixed a bug.
  2. There was a problem with the sacado where the symbol HAS_C99_TR1_CMATH was being defined twice. This has been fixed by leaving it up to the sacado install to determine if this symbol should be defined.

Fix a problem using the colpack option to the speed_cppad program. (There was a problem whereby the speed_cppad program did not properly detect when colpack was available.)

Test third order and fix bug in atomic_eigen_cholesky.hpp for orders greater than or equal to three.

Add the atomic_eigen_cholesky.cpp example.

  1. Fix some missing include files in optimize.hpp and set_union.hpp (when compiling with MS Visual Studio 2015).
  2. Fix a warning in atanh.hpp (when compiling with MS Visual Studio 14).
  3. Fix a typo in the Reverse section of the eigen_mat_inv.hpp example.

Add documentation for only needing to compute a column subset of the sparsity pattern when computing a subset of a sparse Hessians. In addition, improve the corresponding example sparse_sub_hes.cpp .

Correct title in ForSparseHes (change Reverse to Forward).

Change the atomic_mat_mul.cpp example so that on atomic object works for matrices of any size.

Change the atomic_base examples so they do no longer use the deprecated atomic function interfaces to for_sparse_jac, rev_sparse_jac, for_sparse_hes, and rev_sparse_hes.

  1. Improve the atomic_eigen_mat_mul.hpp and atomic_eigen_mat_inv.hpp examples. Most importantly, one atomic object now works for matrices of any size.
  2. Add the vector x , that contains the parameters in an atomic function call to the user following atomic functions: for_sparse_jac , rev_sparse_jac , for_sparse_hes , rev_sparse_hes . This enables one to pass parameter information to these functions; e.g., the dimensions of matrices that the function operates on.

Add more entries to the optimization wish_list .

Add a check_finite wish list item.

  1. Add documentation for redirecting output for the PrintFor function.
  2. Change distributed version to build examples as debug instead of release version. (Was changed to release version while checking for compiler warnings; see 04-17 below).

Fix all some compiler warnings that occurred when compiling the examples with NDEBUG defined.

  1. Fix a bug in the calculation of the atomic_eigen_mat_inv.hpp reverse example.
  2. Use a very simple method (that over estimates variables) for calculating vy in the atomic_eigen_mat_inv.hpp forward example.

  1. Implement and test the atomic_eigen_mat_inv.cpp reverse is implemented.
  2. Fix a bug in the calculation of vy in the atomic_eigen_mat_inv.hpp forward example.

  1. Start construction of the atomic_eigen_mat_inv.cpp example, currently only forward is implemented and tested.
  2. More improvements to atomic_eigen_mat_mul.cpp example.

  1. Fix build of example/atomic.cpp when eigen_prefix is not available (bug introduced when atomic_eigen_mat_mul.cpp was added).
  2. Extend atomic_eigen_mat_mul.cpp example to include for_sparse_jac , rev_sparse_jac , for_sparse_hes , rev_sparse_hes .
  3. Fix a bug in the ForSparseHes routine.
  4. Edit atomic_rev_sparse_hes documentation.

  1. Fix bug in autotools file example/atomic/ (introduced on 03-22).
  2. Improve the atomic_eigen_mat_mul.cpp example and extend it to include reverse mode.

  1. Start construction of the atomic_eigen_mat_mul.cpp example.
  2. change atomic_ode.cpp to checkpoint_ode.cpp and atomic_extended_ode.cpp to checkpoint_extended_ode.cpp .

Change the atomic_mat_mul.hpp class name from mat_mul to atomic_mat_mul. This example use of the name mat_mul in the atomic_mat_mul.cpp example / test.

  1. Include the sub-directory name to the include guards in *.hpp files. For example,
         # ifndef CPPAD_UTILITY_VECTOR_HPP
         # define CPPAD_UTILITY_VECTOR_HPP
    appears in the file cppad/utility/vector.hpp. This makes it easier to avoid conflicts when choosing addon names.
  2. Add the set_union utility and use it to simplify the atomic examples that use vector of sets sparsity patterns.

  1. Move atomic_mat_mul.cpp to atomic_mat_mul_xam.cpp (moved back on 03-21 .
  2. Move atomic_matrix_mul.hpp to atomic_mat_mul.hpp .

Add the atomic_ode.cpp and atomic_extended_ode.cpp examples.

  1. Move the example reverse_any.cpp to reverse_checkpoint.cpp .
  2. Add the atomic_mul_level.cpp example.

The following atomic function examples were added These examples are for a specific atomic operation. In addition, the domain and range dimensions for these examples are not one and not equal to each other: atomic_forward.cpp , atomic_reverse.cpp , atomic_for_sparse_jac.cpp , atomic_rev_sparse_jac.cpp , atomic_for_sparse_hes.cpp , atomic_rev_sparse_hes.cpp .

  1. Improve documentation of implementation requirements for the atomic rev_sparse_jac .
  2. Make some corrections to the atomic_for_sparse_hes documentation. and fix a bug in how CppAD used these functions.

  1. Merged sparse into master branch. This makes the ForSparseHes routine available for use.
  2. Changed the global options in the speed test main program to use one global variable with prototype
         extern std::map<std::string, bool> global_option;

Fix a mistake in the old atomic example/sparsity/sparsity.cpp example. This example has since been changed to atomic_set_sparsity.cpp .

The --with-sparse_set and --with-sparse_set options were removed from the autotools install procedure.

The condition that the operation sequence in f is independent of the independent variables was added to the statement about the validity of the sparsity patterns; see x in ForSparseJac , RevSparseJac , and RevSparseHes .

The cmake command line argument cppad_sparse_list has been removed (because it is so much better than the other option).

A new version of the cppad_sparse_list class (not part of user API) uses reference counters to reduce the number of copies of sets that are equal. This improved the speed of sparsity pattern computations that use the vector of sets representation. For example, the results for the cppad_sparse_hessian.cpp test compare as follows:
     sparse_hessian_size     = [  100,    400,   900,  1600, 2500 ]
     sparse_hessian_rate_old = [ 1480, 265.21, 93.33, 41.93, 0.86 ]
     sparse_hessian_rate_new = [ 1328, 241.61, 92.99, 40.51, 3.80 ]
Note that the improvement is only for large problems. In fact, for large problems, preliminary testing indicates that the new vector of sets representation preforms better than the vector of boolean representation.

Fix a valgrind warning about use of uninitialized memory in the test test_more/checkpoint.cpp (the problem was in the test).

  1. Fix a valgrind warning about use of uninitialized memory when using the adouble base type. This required an optional base_hash function and the special adouble hash_code implementation.
  2. The adouble to_string functions required a special implementation; see adouble to_string .
  3. Add the to_string and hash_code examples to the base_alloc.hpp example.

  1. Fix ambiguity between CppAD::sin and std::sin, and other standard math functions, when using
         using namespace std;
         using namespace CppAD;
    This is OK for simple programs, but not generally recommended. See double version of base class definitions for Unary Standard Math for more details.
  2. Change Eigen array example eigen_array.cpp to use member function version of sin function (as per Eigen's array class documentation).

Input File: omh/appendix/whats_new/whats_new_16.omh