source: trunk/test_more/add_eq.cpp @ 2506

Last change on this file since 2506 was 2506, checked in by bradbell, 8 years ago

Change Licenses: CPL-1.0 -> EPL-1.0, GPL-2.0->GPL-3.0

  • Property svn:keywords set to Id
File size: 3.3 KB
Line 
1/* $Id: add_eq.cpp 2506 2012-10-24 19:36:49Z bradbell $ */
2/* --------------------------------------------------------------------------
3CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-12 Bradley M. Bell
4
5CppAD is distributed under multiple licenses. This distribution is under
6the terms of the
7                    Eclipse Public License Version 1.0.
8
9A copy of this license is included in the COPYING file of this distribution.
10Please visit http://www.coin-or.org/CppAD/ for information on other licenses.
11-------------------------------------------------------------------------- */
12
13/*
14Two old example now used just for valiadation testing
15*/
16# include <cppad/cppad.hpp>
17
18namespace { // BEGIN empty namespace
19
20bool AddEqOne(void)
21{       bool ok = true;
22
23        using namespace CppAD;
24
25
26        // independent variable vector, indices, values, and declaration
27        CPPAD_TESTVECTOR(AD<double>) U(2);
28        size_t s = 0;
29        size_t t = 1;
30        U[s]     = 3.;
31        U[t]     = 2.;
32        Independent(U);
33
34        // dependent variable vector and indices
35        CPPAD_TESTVECTOR(AD<double>) Z(2);
36        size_t x = 0;
37        size_t y = 1;
38
39        // dependent variable values
40        Z[x]  = 4.;
41        Z[y]  = U[t];
42        Z[x] += U[s];  // parameter += variable
43        Z[x] += U[t];  // variable  += variable
44        Z[y] += .5;    // variable  += double
45        // use .5 because it is represented exactly in binary and
46        // because it makes sure that += does not slice the double to an int
47
48        // create f: U -> Z and vectors used for derivative calculations
49        ADFun<double> f(U, Z);
50        CPPAD_TESTVECTOR(double) v( f.Domain() );
51        CPPAD_TESTVECTOR(double) w( f.Range() );
52
53        // check function values
54        ok &= ( Z[x] == 4. + 3. + 2. );
55        ok &= ( Z[y] == 2. + .5 );
56
57        // forward computation of partials w.r.t. s
58        v[s] = 1.;
59        v[t] = 0.;
60        w    = f.Forward(1, v);
61        ok &= ( w[x] == 1. );  // dx/ds
62        ok &= ( w[y] == 0. );  // dy/ds
63
64        // reverse computation of second partials of x
65        CPPAD_TESTVECTOR(double) r( f.Domain() * 2 );
66        w[x] = 1.;
67        w[y] = 0.;
68        r    = f.Reverse(2, w);
69        ok &= ( r[2 * s + 1] == 0. );
70        ok &= ( r[2 * t + 1] == 0. );
71
72        return ok;
73}
74
75bool AddEqTwo(void)
76{       bool ok = true;
77
78        using namespace CppAD;
79
80        // independent variable vector
81        double u0 = .5;
82        CPPAD_TESTVECTOR(AD<double>) U(1);
83        U[0]      = u0; 
84        Independent(U);
85
86        // dependent variable vector
87        CPPAD_TESTVECTOR(AD<double>) Z(1);
88        Z[0] = U[0];       // initial value
89        Z[0] += 2;         // AD<double> += int
90        Z[0] += 4.;        // AD<double> += double
91        Z[0] += U[0];      // AD<double> += AD<double>
92
93        // create f: U -> Z and vectors used for derivative calculations
94        ADFun<double> f(U, Z); 
95        CPPAD_TESTVECTOR(double) v(1);
96        CPPAD_TESTVECTOR(double) w(1);
97
98        // check value
99        ok &= NearEqual(Z[0] , u0+2+4+u0,  1e-10 , 1e-10);
100
101        // forward computation of partials w.r.t. u
102        size_t j;
103        size_t p     = 5;
104        double jfac  = 1.;
105        double value = 2.;
106        v[0]         = 1.;
107        for(j = 1; j < p; j++)
108        {       jfac *= j;
109                w     = f.Forward(j, v);       
110                ok &= NearEqual(jfac*w[0], value, 1e-10 , 1e-10); // d^jz/du^j
111                v[0]  = 0.;
112                value = 0.;
113        }
114
115        // reverse computation of partials of Taylor coefficients
116        CPPAD_TESTVECTOR(double) r(p); 
117        w[0]  = 1.;
118        r     = f.Reverse(p, w);
119        jfac  = 1.;
120        value = 2.;
121        for(j = 0; j < p; j++)
122        {       ok &= NearEqual(jfac*r[j], value, 1e-10 , 1e-10); // d^jz/du^j
123                jfac *= (j + 1);
124                value = 0.;
125        }
126
127        return ok;
128}
129
130} // END empty namespace
131
132bool AddEq(void)
133{       bool ok = true;
134        ok     &= AddEqOne();
135        ok     &= AddEqTwo();
136        return ok;
137}
138
139// END PROGRAM
Note: See TracBrowser for help on using the repository browser.