Changeset 709 for trunk/test_more


Ignore:
Timestamp:
Dec 10, 2006 12:42:58 PM (14 years ago)
Author:
bradbell
Message:

/home/Brad/CppAD/trunk: Fix bug in pow function so it works in more special cases.

svn_commit.sh: file that made this commit.
test_more/pow.cpp: more special cases (including some with x < 0).
forward_sweep.hpp: fix bug in previous version (X was undefined).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/test_more/pow.cpp

    r708 r709  
    184184}
    185185
     186bool PowTestThree(void)
     187{       bool ok = true;
     188
     189        using CppAD::AD;
     190        using CppAD::NearEqual;
     191
     192        // domain space vector
     193        size_t n  = 1;
     194        CppADvector< AD<double> > x(n);
     195        x[0]      = 2.;
     196
     197        // declare independent variables and start tape recording
     198        CppAD::Independent(x);
     199
     200        // range space vector
     201        size_t m = 4;
     202        CppADvector< AD<double> > y(m);
     203
     204        // some special cases
     205        y[0] = pow(x[0], 0.);
     206        y[1] = pow(0., x[0]);
     207        y[2] = pow(x[0], 1.);
     208        y[3] = pow(1., x[0]);
     209
     210        // create f: x -> y and stop tape recording
     211        CppAD::ADFun<double> f(x, y);
     212
     213        // check function values
     214        ok  &= (Value(y[0]) == 1.);
     215        ok  &= (Value(y[1]) == 0.);
     216        ok  &= (Value(y[2]) == Value(x[0]));
     217        ok  &= (Value(y[3]) == 1.);
     218
     219        // forward computation of first partial w.r.t. x
     220        CppADvector<double> dx(n);
     221        CppADvector<double> dy(m);
     222        dx[0] = 1.;
     223        dy    = f.Forward(1, dx);
     224        ok   &= (dy[0] == 0.);
     225        ok   &= (dy[1] == 0.);
     226        ok   &= NearEqual(dy[2], 1., 1e-10, 1e-10);
     227        ok   &= (dy[3] == 0.);
     228
     229        // reverse mode computation of derivative of y[0] + y[1]
     230        CppADvector<double>  w(m);
     231        CppADvector<double> dw(n);
     232        w[0] = 1.;
     233        w[1] = 1.;
     234        w[2] = 1.;
     235        w[3] = 1.;
     236        dw   = f.Reverse(1, w);
     237        ok  &= NearEqual(dw[0], 1., 1e-10, 1e-10);
     238
     239        return ok;     
     240}
     241
     242bool PowTestFour(void)
     243{       bool ok = true;
     244
     245        using CppAD::AD;
     246        using CppAD::NearEqual;
     247
     248        // domain space vector
     249        size_t n  = 1;
     250        CppADvector< AD<double> > x(n);
     251        x[0]      = -2.;
     252
     253        // declare independent variables and start tape recording
     254        CppAD::Independent(x);
     255
     256        // range space vector
     257        size_t m = 3;
     258        CppADvector< AD<double> > y(m);
     259
     260        // some special cases (skip zero raised to a negative power)
     261        y[0] = pow(x[0], 0.);
     262        y[1] = pow(x[0], 1.);
     263        y[2] = pow(1., x[0]);
     264
     265        // create f: x -> y and stop tape recording
     266        CppAD::ADFun<double> f(x, y);
     267
     268        ok  &= (Value(y[0]) == 1.);
     269        ok  &= (Value(y[1]) == Value(x[0]));
     270        ok  &= (Value(y[2]) == 1.);
     271
     272        // forward computation of first partial w.r.t. x
     273        CppADvector<double> dx(n);
     274        CppADvector<double> dy(m);
     275        dx[0] = 1.;
     276        dy    = f.Forward(1, dx);
     277        ok   &= (dy[0] == 0.);
     278        ok   &= NearEqual(dy[1], 1., 1e-10, 1e-10);
     279        ok   &= (dy[2] == 0.);
     280
     281        // reverse mode computation of derivative of y[0] + y[1] + y[2]
     282        CppADvector<double>  w(m);
     283        CppADvector<double> dw(n);
     284        w[0] = 1.;
     285        w[1] = 1.;
     286        w[2] = 1.;
     287        dw   = f.Reverse(1, w);
     288        ok  &= NearEqual(dw[0], 1., 1e-10, 1e-10);
     289
     290        return ok;     
     291}
     292
    186293} // END empty namespace
    187294 
     
    190297        ok     &= PowTestOne();
    191298        ok     &= PowTestTwo();
     299        ok     &= PowTestThree();
     300        ok     &= PowTestFour();
    192301        return ok;
    193302}
Note: See TracChangeset for help on using the changeset viewer.