Changeset 1469 for trunk/test_more


Ignore:
Timestamp:
Jul 30, 2009 10:45:53 AM (11 years ago)
Author:
bradbell
Message:

trunk: Add reverse sparse Jacobian and Hessian CondExp? routines.

test_more.cpp: change RevSparseJac? to rev_sparse_jac.
cond_exp_ad.cpp: new pattern valid for all independent variable values.
rev_sparse_jac.cpp: new pattern valid for all independent variable values.
rev_sparse_jac.cpp: new pattern valid for all independent variable values.
for_jac_sweep.hpp: add some white space.
rev_jac_sweep.hpp: use new sparse Jacobian routine.
rev_hes_sweep.hpp: use new sparse Hessian routine.
cond_op.hpp: define new routines.

Location:
trunk/test_more
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/test_more/cond_exp_ad.cpp

    r1468 r1469  
    162162        for(i = 0; i < m; i++)
    163163        {       for(j = 0; j < n; j++)
    164                         ok &= ( Px[i * n + j] == (J[i * n + j] == 1.) );
     164                        ok &= ( Px[i * n + j] == ( j > 0 ) );
    165165        }
    166166
     
    315315        for(i = 0; i < m; i++)
    316316        {       for(j = 0; j < n; j++)
    317                         ok &= ( Px[i * n + j] == (J[i * n + j] == 1.) );
     317                        ok &= ( Px[i * n + j] == (j > 0) );
    318318        }
    319319
  • trunk/test_more/rev_sparse_hes.cpp

    r1370 r1469  
    11/* $Id$ */
    22/* --------------------------------------------------------------------------
    3 CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-07 Bradley M. Bell
     3CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-09 Bradley M. Bell
    44
    55CppAD is distributed under multiple licenses. This distribution is under
     
    1313
    1414# include <cppad/cppad.hpp>
     15 
     16namespace { // Begin empty namespace
    1517
    16 
    17 bool RevSparseHes(void)
     18bool case_one(void)
    1819{       bool ok = true;
    1920        using namespace CppAD;
     
    5253        // CondExpLt(variable, variable, variable, variable)
    5354        sum += CondExpLt(X[1], X[2], sin(X[6]), cos(X[7]) );
    54         if( X[1] < X[2] )
    55                 Check[6 * n + 6] = true;
    56         else    Check[7 * n + 7] = true;
     55        Check[6 * n + 6] = true;
     56        Check[7 * n + 7] = true;
    5757       
    5858        // pow(variable, variable)
     
    102102        return ok;
    103103}
     104
     105bool case_two(void)
     106{       bool ok = true;
     107        using namespace CppAD;
     108
     109        // dimension of the domain space
     110        size_t n = 4;
     111
     112        // dimension of the range space
     113        size_t m = 1;
     114
     115        // temporary indices
     116        size_t i, j;
     117
     118        // initialize check values to false
     119        CPPAD_TEST_VECTOR<bool> Check(n * n);
     120        for(j = 0; j < n * n; j++)
     121                Check[j] = false;
     122
     123        // independent variable vector
     124        CPPAD_TEST_VECTOR< AD<double> > X(n);
     125        for(j = 0; j < n; j++)
     126                X[j] = AD<double>(j);
     127        Independent(X);
     128
     129        // Test the case where dependent variable is a non-linear function
     130        // of the result of a conditional expression.
     131        CPPAD_TEST_VECTOR< AD<double> > Y(m);
     132        Y[0] = CondExpLt(X[0], X[1], X[2], X[3]);
     133        Y[0] = cos(Y[0]) + X[0] + X[1];
     134
     135        // Hessian with respect to x[0] and x[1] is zero.
     136        // Hessian with respect to x[2] and x[3] is full
     137        // (although we know that there are no cross terms, this is an
     138        // inefficiency of the conditional expression operator).
     139        Check[2 * n + 2] = Check[ 2 * n + 3 ] = true;
     140        Check[3 * n + 2] = Check[ 3 * n + 3 ] = true;
     141       
     142        // create function object F : X -> Y
     143        ADFun<double> F(X, Y);
     144
     145        // sparsity pattern for the identity function U(x) = x
     146        CPPAD_TEST_VECTOR<bool> Px(n * n);
     147        for(i = 0; i < n; i++)
     148        {       for(j = 0; j < n; j++)
     149                        Px[ i * n + j ] = false;
     150                Px[ i * n + i ] = true;
     151        }
     152
     153        // compute sparsity pattern for Jacobian of F(U(x))
     154        F.ForSparseJac(n, Px);
     155
     156        // compute sparsity pattern for Hessian of F_0 ( U(x) )
     157        CPPAD_TEST_VECTOR<bool> Py(m);
     158        Py[0] = true;
     159        CPPAD_TEST_VECTOR<bool> Pxx(n * n);
     160        Pxx = F.RevSparseHes(n, Py);
     161
     162        // check values
     163        for(j = 0; j < n * n; j++)
     164                ok &= (Pxx[j] == Check[j]);
     165
     166        return ok;
     167}
     168
     169} // End of empty namespace
     170
     171bool rev_sparse_hes(void)
     172{       bool ok = true;
     173        // ok &= case_one();
     174        ok &= case_two();
     175
     176        return ok;
     177}
  • trunk/test_more/rev_sparse_jac.cpp

    r1370 r1469  
    11/* $Id$ */
    22/* --------------------------------------------------------------------------
    3 CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-07 Bradley M. Bell
     3CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-09 Bradley M. Bell
    44
    55CppAD is distributed under multiple licenses. This distribution is under
     
    125125        Y[index] = CondExpLt(X[0], X[1], X[0], X[1]);
    126126        Check[index * n + 0] = true;
    127         Check[index * n + 1] = false;
     127        Check[index * n + 1] = true;
    128128        Check[index * n + 2] = false;
    129129        index++;
    130130        Y[index] = CondExpLt(X[0], X[1], AD<double>(3.), X[1]);
    131131        Check[index * n + 0] = false;
    132         Check[index * n + 1] = false;
     132        Check[index * n + 1] = true;
    133133        Check[index * n + 2] = false;
    134134        index++;
  • trunk/test_more/test_more.cpp

    r1401 r1469  
    6060extern bool PowInt(void);
    6161extern bool Reverse(void);
    62 extern bool RevSparseHes(void);
     62extern bool rev_sparse_hes(void);
    6363extern bool RevSparseJac(void);
    6464extern bool RevTwo(void);
     
    153153        ok &= Run( PowInt,          "PowInt"         );
    154154        ok &= Run( Reverse,         "Reverse"        );
    155         ok &= Run( RevSparseHes,    "RevSparseHes"  );
     155        ok &= Run( rev_sparse_hes,  "rev_sparse_hes" );
    156156        ok &= Run( RevSparseJac,    "RevSparseJac"   );
    157157        ok &= Run( RevTwo,          "RevTwo"         );
Note: See TracChangeset for help on using the changeset viewer.