Changeset 3345


Ignore:
Timestamp:
Sep 20, 2014 6:15:52 AM (6 years ago)
Author:
bradbell
Message:

Implement and test multiple direction forward mode with cache.

Location:
branches/cache
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/cache/bug/cache.sh

    r3344 r3345  
    3535bool test_cache(void)
    3636{       bool ok = true;
     37        size_t i, j, ell;
     38
    3739        using CppAD::vector;
    3840        using CppAD::AD;
     
    5557        // zero order forward, no cache
    5658        vector<double> x(n), y(m);
    57         x[0] = 1.0;
    58         x[1] = 2.0;
     59        for(j = 0; j < n; j++)
     60                x[j] = double(j);
    5961        y = f.Forward(0, x);
    6062
    6163        // first order forward, no cache
    6264        vector<double> dx(n), dy(m);
    63         dx[0] = 3.0;
    64         dx[1] = 4.0;
     65        for(j = 0; j < n; j++)
     66                dx[j] = double(j + 1);
    6567        dy = f.Forward(1, dx);
     68
     69        // multiple direction forward, no cache
     70        size_t r = 2;
     71        vector<double> dxr(n*r), dyr(m*r);
     72        for(j = 0; j < n; j++)
     73        {       for(ell = 0; ell < r; ell++)
     74                        dxr[r * j + ell] = double(j + ell + 2);
     75        }
     76        dyr = f.Forward(1, r, dxr);
    6677
    6778        // create cache
     
    7182        vector<double> y_cache(m);
    7283        y_cache = f.Forward(0, x);
    73         ok &= y[0] == y_cache[0];
    74         ok &= y[1] == y_cache[1];
     84        for(i = 0; i < m; i++)
     85                ok &= y[i] == y_cache[i];
    7586        // std::cout << "y       = " << y       << std::endl;
    7687        // std::cout << "y_cache = " << y_cache << std::endl;
     
    8091        vector<double> dy_cache(m);
    8192        dy_cache = f.Forward(1, dx);
    82         ok &= dy[0] == dy_cache[0];
    83         ok &= dy[1] == dy_cache[1];
     93        for(i = 0; i < m; i++)
     94                ok &= dy[i] == dy_cache[i];
    8495        // std::cout << "dy       = " << dy       << std::endl;
    8596        // std::cout << "dy_cache = " << dy_cache << std::endl;
     97
     98        // multiple direction forward, with cache
     99        vector<double> dyr_cache(m*r);
     100        dyr_cache = f.Forward(1, r, dxr);
     101        for(i = 0; i < m; i++)
     102        {       for(ell = 0; ell < r; ell++)
     103                        ok &= dyr[i * r + ell] == dyr_cache[i * r + ell];
     104        }
     105        // std::cout << "dyr       = " << dyr       << std::endl;
     106        // std::cout << "dyr_cache = " << dyr_cache << std::endl;
    86107
    87108        return ok;
  • branches/cache/cppad/local/forward2sweep.hpp

    r3342 r3345  
    223223        CppAD::vector<Base> Z_vec(q+1);
    224224# endif
    225 # ifndef NDEBUG
    226         // 2DO: implement tracing cache
    227         CppAD::vector<addr_t> cache2var;
    228 # endif
     225
     226        // data structure for cache information
     227        size_t num_cache = play->num_cache_rec();
     228        CppAD::vector<addr_t> cache2var( num_cache );
     229
     230        // initialize cache indices with invalid variable value
     231        for(size_t i = 0; i < num_cache; i++)
     232                cache2var[i] = addr_t(0);
     233
    229234        bool more_operators = true;
    230235        while(more_operators)
     
    647652                        default:
    648653                        CPPAD_ASSERT_UNKNOWN(0);
     654                }
     655                if( num_cache != 0 )
     656                {       size_t i_cache = size_t( play->GetVar2Cache(i_var) );
     657                        CPPAD_ASSERT_UNKNOWN( i_cache >= num_var );
     658                        Base* cache = taylor + i_cache * ( (J-1) * r + 1 );
     659                        Base* var   = taylor + i_var * ( (J-1) * r + 1 );
     660                        cache[0]    = var[0];
     661                        for(ell = 0; ell < r; ell++)
     662                        {       for(k = 1; k <= q; k++)
     663                                {       size_t index = (k - 1) * r + ell + 1;
     664                                        cache[index] = var[index];
     665                                }
     666                        }
     667                        // use zero orgin cache indiex for cache2var vector
     668                        cache2var[ i_cache - num_var ] = i_var;
    649669                }
    650670# if CPPAD_FORWARD2SWEEP_TRACE
Note: See TracChangeset for help on using the changeset viewer.