![]() |
Prev | Next | cppad_ode.cpp |
# include <cstring>
# include <cppad/cppad.hpp>
# include <cppad/speed/ode_evaluate.hpp>
# include <cppad/speed/uniform_01.hpp>
# include <cassert>
bool link_ode(
size_t size ,
size_t repeat ,
bool retape ,
CppAD::vector<double> &x ,
CppAD::vector<double> &gradient
)
{ // -------------------------------------------------------------
// setup
typedef CppAD::AD<double> ADScalar;
typedef CppAD::vector<ADScalar> ADVector;
typedef CppAD::vector<double> DblVector;
size_t j;
size_t m = 0;
size_t n = size;
assert( x.size() == n );
ADVector X(n);
ADVector Y(1);
DblVector w(1);
w[0] = 1.;
if( retape ) while(repeat--)
{ // choose next x value
uniform_01(n, x);
for(j = 0; j < n; j++)
X[j] = x[j];
// declare the independent variable vector
Independent(X);
// evaluate function
CppAD::ode_evaluate(X, m, Y);
// create function object f : X -> Y
CppAD::ADFun<double> F(X, Y);
// use reverse mode to compute gradient
gradient = F.Reverse(1, w);
}
else
{ // choose any x value
for(j = 0; j < n; j++)
X[j] = 0.;
// declare the independent variable vector
Independent(X);
// evaluate function
CppAD::ode_evaluate(X, m, Y);
// create function object f : X -> Y
CppAD::ADFun<double> F(X, Y);
while(repeat--)
{ // choose next x value
uniform_01(n, x);
// zero order forward mode to evaluate function at x
F.Forward(0, x);
// first order reverse mode to compute gradient
gradient = F.Reverse(1, w);
}
}
return true;
}