Changeset 3368 for trunk/test_more


Ignore:
Timestamp:
Sep 28, 2014 4:14:36 AM (5 years ago)
Author:
bradbell
Message:

Convert bug/opt_atomic.sh to one of the cases in test_more/optimize.cpp.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/test_more/optimize.cpp

    r3359 r3368  
    14551455                ok &= y[0] == -6.0;
    14561456       
     1457                return ok;
     1458        }
     1459        // ----------------------------------------------------------------
     1460        // Test bug where atomic functions were not properly conditionally skipped.
     1461        void i_algo(
     1462                const CppAD::vector< CppAD::AD<double> >& ax ,
     1463                      CppAD::vector< CppAD::AD<double> >& ay )
     1464        {       ay[0] = 1.0 / ax[0]; }
     1465       
     1466        bool cond_exp_skip_atomic(void)
     1467        {       bool ok = true;
     1468                using CppAD::AD;
     1469                using CppAD::vector;
     1470       
     1471                // Create a checkpoint version of the function i_algo
     1472                vector< AD<double> > au(1), av(1), aw(1);
     1473                au[0] = 1.0;
     1474                CppAD::checkpoint<double> i_check("i_check", i_algo, au, av);
     1475       
     1476                // independent variable vector
     1477                vector< AD<double> > ax(2), ay(1);
     1478                ax[0] = 1.0;
     1479                ax[1] = 2.0;
     1480                Independent(ax);
     1481       
     1482                // call atomic function that does not get used
     1483                au[0] = ax[0];
     1484                i_check(au, av);
     1485                au[0] = ax[1];
     1486                i_check(au, aw);
     1487                AD<double> zero = 0.0;
     1488                ay[0] = CondExpGt(av[0], zero, av[0], aw[0]);
     1489
     1490                // create function object f : ax -> ay
     1491                CppAD::ADFun<double> f(ax, ay);
     1492
     1493                // run case that skips the second call to afun
     1494                // (can use trace in forward0sweep.hpp to see this).
     1495                vector<double> x(2), y_before(1), y_after(1);
     1496                x[0]      = 1.0;
     1497                x[1]      = 2.0;
     1498                y_before  = f.Forward(0, x);
     1499                f.optimize();
     1500                y_after   = f.Forward(0, x);
     1501       
     1502                ok &= y_before[0] == y_after[0];
     1503               
    14571504                return ok;
    14581505        }
     
    15021549        // case where a discrete function is used
    15031550        ok     &= discrete_function();
     1551        // check conditional skip of an atomic function
     1552        ok     &= cond_exp_skip_atomic();
    15041553        //
    15051554        CppAD::user_atomic<double>::clear();
Note: See TracChangeset for help on using the changeset viewer.