Changeset 3810


Ignore:
Timestamp:
Mar 26, 2016 10:43:57 AM (4 years ago)
Author:
bradbell
Message:

merge to branch: trunk
from repository: https://github.com/coin-or/CppAD
start hash code: dd967ef41b8d6731d90ebb8b3e7e8b863565289c
end hash code: f77cd2e443b8d14f354f97efc4c26369227dfe81

commit f77cd2e443b8d14f354f97efc4c26369227dfe81
Author: Brad Bell <bradbell@…>
Date: Sat Mar 26 06:47:33 2016 -0700

  1. Add reverse mode to atomic_eigen_mat_inv.
  2. Advance version to cppad-20160326.


eigen_mat_mul.cpp: impove reverse mode comments.

commit 94c81399191d06ae9cef81c271f520b0e78f079d
Author: Brad Bell <bradbell@…>
Date: Fri Mar 25 12:16:03 2016 -0700

whats_new_16.omh: add comment about changes to eigen_mat_mul.

commit d647288c9e022f16ef94229db612a774808a5de3
Author: Brad Bell <bradbell@…>
Date: Fri Mar 25 11:59:45 2016 -0700

Replace pack and unpack by member function that inverts matrices.

commit 6fba95d90e50590abd438946f47025e0a6e34c2c
Author: Brad Bell <bradbell@…>
Date: Fri Mar 25 11:45:43 2016 -0700

Replace pack and unpack by member function that multiplies matrices.

commit cac97c115abad9fba0d0c3706f4bc0e5a7f617f0
Author: Brad Bell <bradbell@…>
Date: Fri Mar 25 11:11:16 2016 -0700

Change atomic_eigen_mat_div -> atomic_eigen_mat_inv.

commit 1f7e52a4d96986f7be2ad2d6abeafc086c4f7622
Author: Brad Bell <bradbell@…>
Date: Fri Mar 25 08:09:39 2016 -0700

  1. Implement and test forward for atomic_eigen_mat_div.
  2. Advance version to 20160325.


eigen_mat_mul.hpp: edit comments and documentation.

commit e953f669d8e9e122dc2f182c28c051c9ba75c705
Author: Brad Bell <bradbell@…>
Date: Fri Mar 25 04:32:45 2016 -0700

eigen_mat_mul.cpp: No longer under construction.

commit 3a62044eaebb6393676276e5b843fbe5db4f45a2
Author: Brad Bell <bradbell@…>
Date: Fri Mar 25 04:07:18 2016 -0700

eigen_mat_mul.hpp: add assert for f_left_ and f_right_ in reverse.

commit 721d64783547487fe69100c7190628efab7149c3
Author: Brad Bell <bradbell@…>
Date: Fri Mar 25 03:59:05 2016 -0700

eigen_mat_mul.hpp: typo Publice -> Public.

Location:
trunk
Files:
2 added
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/AUTHORS

    r3808 r3810  
    22             ===========================================
    33
    4 To date, 2016-03-24, Bradley M. Bell is the sole author of CppAD.
     4To date, 2016-03-26, Bradley M. Bell is the sole author of CppAD.
    55While Bradley M. Bell worked for the University of Washington during
    66the development of CppAD, the following are also true:
  • trunk/CMakeLists.txt

    r3808 r3810  
    1818
    1919# cppad_version is used by set_version.sh to get the version number.
    20 SET(cppad_version      "20160324" )
     20SET(cppad_version      "20160326" )
    2121SET(cppad_url          "http://www.coin-or.org/CppAD" )
    2222SET(cppad_description  "Differentiation of C++ Algorithms" )
  • trunk/bin/batch_edit.sh

    r3805 r3810  
    1414'
    1515move_list='
     16        example/atomic/eigen_mat_div.cpp
     17        cppad/example/eigen_mat_div.hpp
    1618'
    17 move_sed='s|matrix_mul.hpp|mat_mul.hpp|'
     19move_sed='s|mat_div|mat_inv|'
    1820#
    1921cat << EOF > junk.sed
    20 s|atomic_extended_ode.cpp|checkpoint_extended_ode.cpp|g
    21 s|atomic_ode.cpp|checkpoint_ode.cpp|g
     22s|mat_div|mat_inv|g
     23s|MAT_DIV|MAT_INV|
    2224EOF
    2325# -----------------------------------------------------------------------------
  • trunk/configure

    r3808 r3810  
    11#! /bin/sh
    22# Guess values for system-dependent variables and create Makefiles.
    3 # Generated by GNU Autoconf 2.69 for cppad 20160324.
     3# Generated by GNU Autoconf 2.69 for cppad 20160326.
    44#
    55# Report bugs to <cppad@list.coin-or.org>.
     
    581581PACKAGE_NAME='cppad'
    582582PACKAGE_TARNAME='cppad'
    583 PACKAGE_VERSION='20160324'
    584 PACKAGE_STRING='cppad 20160324'
     583PACKAGE_VERSION='20160326'
     584PACKAGE_STRING='cppad 20160326'
    585585PACKAGE_BUGREPORT='cppad@list.coin-or.org'
    586586PACKAGE_URL=''
     
    14071407  # This message is too long to be a string in the A/UX 3.1 sh.
    14081408  cat <<_ACEOF
    1409 \`configure' configures cppad 20160324 to adapt to many kinds of systems.
     1409\`configure' configures cppad 20160326 to adapt to many kinds of systems.
    14101410
    14111411Usage: $0 [OPTION]... [VAR=VALUE]...
     
    14771477if test -n "$ac_init_help"; then
    14781478  case $ac_init_help in
    1479      short | recursive ) echo "Configuration of cppad 20160324:";;
     1479     short | recursive ) echo "Configuration of cppad 20160326:";;
    14801480   esac
    14811481  cat <<\_ACEOF
     
    16111611if $ac_init_version; then
    16121612  cat <<\_ACEOF
    1613 cppad configure 20160324
     1613cppad configure 20160326
    16141614generated by GNU Autoconf 2.69
    16151615
     
    22402240running configure, to aid debugging if configure makes a mistake.
    22412241
    2242 It was created by cppad $as_me 20160324, which was
     2242It was created by cppad $as_me 20160326, which was
    22432243generated by GNU Autoconf 2.69.  Invocation command line was
    22442244
     
    31303130# Define the identity of the package.
    31313131 PACKAGE='cppad'
    3132  VERSION='20160324'
     3132 VERSION='20160326'
    31333133
    31343134
     
    85648564# values after options handling.
    85658565ac_log="
    8566 This file was extended by cppad $as_me 20160324, which was
     8566This file was extended by cppad $as_me 20160326, which was
    85678567generated by GNU Autoconf 2.69.  Invocation command line was
    85688568
     
    86218621ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
    86228622ac_cs_version="\\
    8623 cppad config.status 20160324
     8623cppad config.status 20160326
    86248624configured by $0, generated by GNU Autoconf 2.69,
    86258625  with options \\"\$ac_cs_config\\"
  • trunk/configure.ac

    r3808 r3810  
    1313dnl Process this file with autoconf to produce a configure script.
    1414dnl   package   version              bug-report
    15 AC_INIT([cppad], [20160324], [cppad@list.coin-or.org])
     15AC_INIT([cppad], [20160326], [cppad@list.coin-or.org])
    1616AM_SILENT_RULES([yes])
    1717
  • trunk/cppad/example/eigen_mat_mul.hpp

    r3809 r3810  
    1818$spell
    1919        Eigen
     20        Taylor
    2021$$
    2122
    2223$section Atomic Eigen Matrix Multiply Class$$
     24
     25$head Purpose$$
     26For fixed positive integers $latex r$$, $latex m$$, $latex c$$,
     27construct and atomic operation that computes the matrix product
     28$latex R = A \times B$$ for any $latex A \in \B{R}^{r \times m}$$ and
     29$latex B \in \B{R}^{m \times c}$$.
     30
     31$head Theory$$
     32
     33$subhead Forward$$
     34For $latex k = 0 , \ldots $$, the $th k$$ order Taylor coefficient
     35$latex R_k$$ is given by
     36$latex \[
     37        R_k = \sum_{\ell = 0}^{k} A_\ell B_{k-\ell}
     38\] $$
     39
     40$subhead Reverse$$
     41We use $latex \bar{R}_k$$ for the partial of the scalar final result
     42with respect to $latex R_k$$.
     43The back-propagation algorithm that eliminates $latex R_k$$ is,
     44for $latex \ell = 0, \ldots , k-1$$,
     45$latex \[
     46\bar{A}_\ell     = \bar{A}_\ell     + \bar{R}_k B_{k-\ell}^\R{T}
     47\] $$
     48$latex \[
     49\bar{B}_{k-\ell} =  \bar{B}_{k-\ell} + A_\ell^\R{T} \bar{R}_k
     50\] $$
     51
    2352
    2453$nospell
     
    3160
    3261/* %$$
    33 $head Publice$$
     62$head Public$$
    3463
    3564$subhead Types$$
     
    74103        { }
    75104/* %$$
    76 $subhead Pack$$
    77 $srccode%cpp% */
    78         template <class Matrix, class Vector>
    79         void pack(
    80                 Vector&        packed  ,
    81                 const Matrix&  left    ,
    82                 const Matrix&  right   )
    83         {       assert( packed.size() == nx_      );
    84                 assert( rows( left ) == nr_left_ );
    85                 assert( cols( left ) == n_middle_ );
    86                 assert( rows( right ) == n_middle_ );
    87                 assert( cols( right ) == nc_right_ );
    88                 //
    89                 size_t n_left = nr_left_ * n_middle_;
    90                 size_t n_right = n_middle_ * nc_right_;
     105$subhead op$$
     106$srccode%cpp% */
     107        // use atomic operation to multiply two AD matrices
     108        ad_matrix op(
     109                const ad_matrix&              left    ,
     110                const ad_matrix&              right   )
     111        {       assert( nr_left_   == size_t( left.rows() )   );
     112                assert( n_middle_  == size_t( left.cols() )   );
     113                assert( n_middle_  == size_t( right.rows() )  );
     114                assert( nc_right_  == size_t ( right.cols() ) );
     115
     116                // -----------------------------------------------------------------
     117                // packed version of left and right
     118                CPPAD_TESTVECTOR(ad_scalar) packed_arg(nx_);
     119                size_t n_left   = nr_left_ * n_middle_;
     120                size_t n_right  = n_middle_ * nc_right_;
     121                size_t n_result = nr_left_ * nc_right_;
    91122                assert( n_left + n_right == nx_ );
     123                assert( n_result == ny_ );
    92124                //
    93125                for(size_t i = 0; i < n_left; i++)
    94                         packed[i] = left.data()[i];
     126                        packed_arg[i] = left.data()[i];
    95127                for(size_t i = 0; i < n_right; i++)
    96                         packed[ i + n_left ] = right.data()[i];
    97                 //
    98                 return;
    99         }
    100 /* %$$
    101 $subhead Unpack$$
    102 $srccode%cpp% */
    103         template <class Matrix, class Vector>
    104         void unpack(
    105                 const Vector&   packed  ,
    106                 Matrix&         result  )
    107         {       assert( packed.size() == ny_      );
    108                 assert( rows( result ) == nr_left_ );
    109                 assert( cols( result ) == nc_right_ );
    110                 //
    111                 size_t n_result = nr_left_ * nc_right_;
    112                 assert( n_result == ny_ );
    113                 //
     128                        packed_arg[ i + n_left ] = right.data()[i];
     129
     130                // ------------------------------------------------------------------
     131                // packed version of result = left * right
     132                CPPAD_TESTVECTOR(ad_scalar) packed_result(ny_);
     133                (*this)(packed_arg, packed_result);
     134
     135                // ------------------------------------------------------------------
     136                // unpack result matrix
     137                ad_matrix result(nr_left_, nc_right_);
    114138                for(size_t i = 0; i < n_result; i++)
    115                         result.data()[i] = packed[ i ];
    116                 //
    117                 return;
     139                        result.data()[i] = packed_result[ i ];
     140                //
     141                return result;
    118142        }
    119143/* %$$
     
    227251                }
    228252
    229                 // check if we are compute vy
     253                // check if we are computing vy
    230254                if( vx.size() == 0 )
    231255                        return true;
     
    239263                        {       bool var = false;
    240264                                for(size_t ell = 0; ell < n_middle_; ell++)
    241                                 {       size_t index   = i * n_middle_ + ell;
     265                                {       // left information
     266                                        size_t index   = i * n_middle_ + ell;
    242267                                        bool var_left  = vx[index];
    243268                                        bool nz_left   = var_left | (f_left_[0](i, ell) != zero);
    244                                         index          = nr_left_ * n_middle_;
    245                                         index         += ell * nc_right_ + j;
     269                                        // right information
     270                                        index          = n_left + ell * nc_right_ + j;
    246271                                        bool var_right = vx[index];
    247272                                        bool nz_right  = var_right | (f_right_[0](ell, j) != zero);
     273                                        // effect of result
    248274                                        var |= var_left & nz_right;
    249275                                        var |= nz_left  & var_right;
     
    260286        // reverse mode routine called by CppAD
    261287        virtual bool reverse(
    262                 // highest order Taylor coefficient that we are computing deritive of
     288                // highest order Taylor coefficient that we are computing derivative of
    263289                size_t                     q ,
    264290                // forward mode Taylor coefficients for x variables
     
    282308                assert( n_left + n_right == nx_ );
    283309                assert( n_result == ny_ );
    284                 //
     310                // -------------------------------------------------------------------
     311                // make sure f_left_, f_right_ are large enough
     312                assert( f_left_.size() == f_right_.size() );
     313                assert( f_left_.size() == f_result_.size() );
     314                // must have previous run forward with order >= n_order
     315                assert( f_left_.size() >= n_order );
    285316                // -------------------------------------------------------------------
    286317                // make sure r_left_, r_right_, and r_result_ are large enough
     
    310341                }
    311342                // -------------------------------------------------------------------
    312                 // unpack result_ from py
     343                // unpack py into r_result_
    313344                for(size_t k = 0; k < n_order; k++)
    314345                {       for(size_t i = 0; i < n_result; i++)
  • trunk/doc.omh

    r3808 r3810  
    9292$comment bin/version assumes that : follows cppad version number here$$
    9393$section
    94 cppad-20160324: A Package for Differentiation of C++ Algorithms
     94cppad-20160326: A Package for Differentiation of C++ Algorithms
    9595$$
    9696$mindex AD algorithmic differentiation automatic C++ algorithm derivative CppAD version cppad.hpp$$
  • trunk/example/atomic/CMakeLists.txt

    r3808 r3810  
    1717#
    1818# eigen_sources and CPPAD_EIGEN_EXAMPLES
    19 SET(sources eigen_mat_mul.cpp)
     19SET(sources eigen_mat_inv.cpp eigen_mat_mul.cpp)
    2020sources_libs_define(eigen "${sources}" "" EIGEN_EXAMPLES)
    2121#
  • trunk/example/atomic/atomic.cpp

    r3808 r3810  
    2222// external complied tests
    2323extern bool checkpoint(void);
     24extern bool eigen_mat_inv(void);
    2425extern bool eigen_mat_mul(void);
    2526extern bool extended_ode(void);
     
    8283        ok &= Run( tangent,             "tangent"        );
    8384# ifdef CPPAD_EIGEN_EXAMPLES
     85        ok &= Run( eigen_mat_inv,       "eigen_mat_inv"  );
    8486        ok &= Run( eigen_mat_mul,       "eigen_mat_mul"  );
    8587# endif
  • trunk/example/atomic/eigen_mat_mul.cpp

    r3809 r3810  
    1919
    2020$section  Atomic Eigen Matrix Multiply: Example and Test$$
    21 
    22 $head Under Construction$$
    23 This example is under construction. So far only forward mode has been
    24 implemented.
    2521
    2622$head Description$$
     
    6056# include <cppad/example/eigen_mat_mul.hpp>
    6157
    62 namespace {
    63         typedef double            scalar;
    64         typedef CppAD::AD<scalar> ad_scalar;
    65         typedef typename atomic_eigen_mat_mul<scalar>::matrix     matrix;
     58bool eigen_mat_mul(void)
     59{       //
     60        typedef double                                            scalar;
     61        typedef CppAD::AD<scalar>                                 ad_scalar;
    6662        typedef typename atomic_eigen_mat_mul<scalar>::ad_matrix  ad_matrix;
    67 
    68         // use atomic operation to multiply two AD matrices
    69         ad_matrix matrix_multiply(
    70                 atomic_eigen_mat_mul<scalar>& mat_mul ,
    71                 const ad_matrix&              left    ,
    72                 const ad_matrix&              right   )
    73         {       size_t nr_left   = size_t( left.rows() );
    74                 size_t n_middle    = size_t( left.cols() );
    75                 size_t nc_right  = size_t ( right.cols() );
    76                 assert( size_t( right.rows() ) == n_middle );
    77 
    78                 // packed version of left and right
    79                 size_t nx = (nr_left + nc_right) * n_middle;
    80                 CPPAD_TESTVECTOR(ad_scalar) packed_arg(nx);
    81                 mat_mul.pack(packed_arg, left, right);
    82 
    83                 // packed version of result = left * right
    84                 size_t ny = nr_left * nc_right;
    85                 CPPAD_TESTVECTOR(ad_scalar) packed_result(ny);
    86                 mat_mul(packed_arg, packed_result);
    87 
    88                 // result matrix
    89                 ad_matrix result(nr_left, nc_right);
    90                 mat_mul.unpack(packed_result, result);
    91 
    92                 return result;
    93         }
    94 
    95 }
    96 
    97 bool eigen_mat_mul(void)
    98 {       bool ok    = true;
     63        //
     64        bool ok    = true;
    9965        scalar eps = 10. * std::numeric_limits<scalar>::epsilon();
    10066        using CppAD::NearEqual;
     
    134100        // -------------------------------------------------------------------
    135101        // use atomic operation to multiply left * right
    136         ad_matrix ad_result = matrix_multiply(mat_mul, ad_left, ad_right);
     102        ad_matrix ad_result = mat_mul.op(ad_left, ad_right);
    137103        // -------------------------------------------------------------------
    138104        // check that first component of result is a parameter
     
    200166        CPPAD_TESTVECTOR(scalar) d2w(2 * n);
    201167        d2w   = f.Reverse(2, w);
     168        // partial f_2 w.r.t. x_0
    202169        ok   &= NearEqual(d2w[0 * 2 + 0], 2.0 * x[0], eps, eps);
     170        // partial f_2 w.r.t  x_1
    203171        ok   &= NearEqual(d2w[1 * 2 + 0], 2.0 * x[1], eps, eps);
    204         // partial f_1 w.r.t x_1, x_0
     172        // partial f_2 w.r.t x_1, x_0
    205173        ok   &= NearEqual(d2w[0 * 2 + 1], 0.0,        eps, eps);
    206         // partial f_1 w.r.t x_1, x_1
     174        // partial f_2 w.r.t x_1, x_1
    207175        ok   &= NearEqual(d2w[1 * 2 + 1], 2.0,        eps, eps);
    208176        // -------------------------------------------------------------------
  • trunk/example/atomic/makefile.am

    r3807 r3810  
    2727        atomic.cpp \
    2828        checkpoint.cpp \
     29        eigen_mat_inv.cpp \
    2930        eigen_mat_mul.cpp \
    3031        extended_ode.cpp \
  • trunk/example/atomic/makefile.in

    r3807 r3810  
    9999CONFIG_CLEAN_VPATH_FILES =
    100100am_atomic_OBJECTS = atomic.$(OBJEXT) checkpoint.$(OBJEXT) \
    101         eigen_mat_mul.$(OBJEXT) extended_ode.$(OBJEXT) \
    102         for_sparse_hes.$(OBJEXT) for_sparse_jac.$(OBJEXT) \
    103         forward.$(OBJEXT) get_started.$(OBJEXT) mat_mul.$(OBJEXT) \
    104         mul_level.$(OBJEXT) norm_sq.$(OBJEXT) ode.$(OBJEXT) \
    105         reciprocal.$(OBJEXT) rev_sparse_hes.$(OBJEXT) \
    106         rev_sparse_jac.$(OBJEXT) reverse.$(OBJEXT) \
    107         set_sparsity.$(OBJEXT) tangent.$(OBJEXT)
     101        eigen_mat_inv.$(OBJEXT) eigen_mat_mul.$(OBJEXT) \
     102        extended_ode.$(OBJEXT) for_sparse_hes.$(OBJEXT) \
     103        for_sparse_jac.$(OBJEXT) forward.$(OBJEXT) \
     104        get_started.$(OBJEXT) mat_mul.$(OBJEXT) mul_level.$(OBJEXT) \
     105        norm_sq.$(OBJEXT) ode.$(OBJEXT) reciprocal.$(OBJEXT) \
     106        rev_sparse_hes.$(OBJEXT) rev_sparse_jac.$(OBJEXT) \
     107        reverse.$(OBJEXT) set_sparsity.$(OBJEXT) tangent.$(OBJEXT)
    108108atomic_OBJECTS = $(am_atomic_OBJECTS)
    109109atomic_LDADD = $(LDADD)
     
    351351        atomic.cpp \
    352352        checkpoint.cpp \
     353        eigen_mat_inv.cpp \
    353354        eigen_mat_mul.cpp \
    354355        extended_ode.cpp \
     
    417418@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atomic.Po@am__quote@
    418419@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checkpoint.Po@am__quote@
     420@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eigen_mat_inv.Po@am__quote@
    419421@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eigen_mat_mul.Po@am__quote@
    420422@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extended_ode.Po@am__quote@
  • trunk/makefile.am

    r3805 r3810  
    9696        cppad/example/base_adolc.hpp \
    9797        cppad/example/cppad_eigen.hpp \
     98        cppad/example/eigen_mat_inv.hpp \
    9899        cppad/example/eigen_mat_mul.hpp \
    99100        cppad/example/eigen_plugin.hpp \
  • trunk/makefile.in

    r3806 r3810  
    486486        cppad/example/base_adolc.hpp \
    487487        cppad/example/cppad_eigen.hpp \
     488        cppad/example/eigen_mat_inv.hpp \
    488489        cppad/example/eigen_mat_mul.hpp \
    489490        cppad/example/eigen_plugin.hpp \
  • trunk/omh/atomic_base.omh

    r3805 r3810  
    8585        example/atomic/tangent.cpp%
    8686        example/atomic/eigen_mat_mul.cpp%
     87        example/atomic/eigen_mat_inv.cpp%
    8788        example/atomic/mat_mul.cpp
    8889%$$
  • trunk/omh/example_list.omh

    r3805 r3810  
    9696$rref atan.cpp$$
    9797$rref atanh.cpp$$
     98$rref atomic_eigen_mat_inv.cpp$$
     99$rref atomic_eigen_mat_inv.hpp$$
    98100$rref atomic_eigen_mat_mul.cpp$$
    99101$rref atomic_eigen_mat_mul.hpp$$
  • trunk/omh/install/download.omh

    r3808 r3810  
    9797$rnext
    9898current  $cnext EPL $cnext $href%
    99 http://www.coin-or.org/download/source/CppAD/cppad-20160324.epl.tgz%
    100 cppad-20160324.epl.tgz%$$
     99http://www.coin-or.org/download/source/CppAD/cppad-20160326.epl.tgz%
     100cppad-20160326.epl.tgz%$$
    101101$rnext
    102102current  $cnext GPL $cnext $href%
    103 http://www.coin-or.org/download/source/CppAD/cppad-20160324.gpl.tgz%
    104 cppad-20160324.gpl.tgz%$$
     103http://www.coin-or.org/download/source/CppAD/cppad-20160326.gpl.tgz%
     104cppad-20160326.gpl.tgz%$$
    105105$tend
    106106
  • trunk/omh/install/eigen_prefix.omh

    r3808 r3810  
    3737$rref eigen_det.cpp$$
    3838$rref atomic_eigen_mat_mul.hpp$$
     39$rref atomic_eigen_mat_inv.hpp$$
    3940$tend
    4041
  • trunk/omh/whats_new/whats_new_16.omh

    r3809 r3810  
    3939assist you in learning about changes between various versions of CppAD.
    4040
     41$head 03-26$$
     42Implement and test the $cref atomic_eigen_mat_inv.cpp$$
     43$cref/reverse/atomic_eigen_mat_inv.hpp/Private/reverse/$$ is implemented.
     44
     45$head 03-25$$
     46$list number$$
     47Start construction of the $cref atomic_eigen_mat_inv.cpp$$ example,
     48currently only
     49$cref/forward/atomic_eigen_mat_inv.hpp/Private/forward/$$ is implemented
     50and tested.
     51$lnext
     52More improvements to $cref atomic_eigen_mat_mul.cpp$$ example.
     53$lend
     54
    4155$head 03-24$$
    4256$list number$$
     
    6781$head 03-22$$
    6882$list number$$
    69 Add the $cref atomic_eigen_mat_mul.cpp$$ example; see
    70 $cref/under construction/atomic_eigen_mat_mul.cpp/Under Construction/$$.
     83Start construction of the $cref atomic_eigen_mat_mul.cpp$$ example.
    7184$lnext
    7285change $code atomic_ode.cpp$$ to $cref checkpoint_ode.cpp$$ and
Note: See TracChangeset for help on using the changeset viewer.