# ifndef CPPAD_REV_ONE_INCLUDED # define CPPAD_REV_ONE_INCLUDED /* -------------------------------------------------------------------------- CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-06 Bradley M. Bell CppAD is distributed under multiple licenses. This distribution is under the terms of the Common Public License Version 1.0. A copy of this license is included in the COPYING file of this distribution. Please visit http://www.coin-or.org/CppAD/ for information on other licenses. -------------------------------------------------------------------------- */ /* $begin RevOne$$spell dw Taylor const$$$index derivative, first order driver$$index first, order derivative driver$$ $index driver, first order derivative$$index easy, derivative$$$index driver, easy derivative$$index derivative, easy$$ $section First Order Derivative: Driver Routine$$head Syntax$$$syntax%%dw% = %f%.RevOne(%x%, %i%)%$$head Purpose$$ We use $latex F : B^n \rightarrow B^m$$to denote the xref/glossary/AD Function/AD function/$$ corresponding to$italic f$$. The syntax above sets italic dw$$ to the derivative of $latex F_i$$with respect to latex x$$; i.e.,$latex $dw = F_i^{(1)} (x) = \left[ \D{ F_i }{ x_0 } (x) , \cdots , \D{ F_i }{ x_{n-1} } (x) \right]$ $$head f$$ The object $italic f$$has prototype syntax% ADFun<%Base%> %f% %$$ Note that the$xref/ADFun/$$object italic f$$ is not $code const$$(see xref/RevOne/RevOne Uses Forward/RevOne Uses Forward/$$ below).$head x$$The argument italic x$$ has prototype $syntax% const %Vector% &%x% %$$(see xref/RevOne/Vector/Vector/$$ below) and its size must be equal to$italic n$$, the dimension of the xref/SeqProperty/Domain/domain/$$ space for $italic f$$. It specifies that point at which to evaluate the derivative. head i$$ The index$italic i$$has prototype syntax% size_t %i% %$$ and is less than $latex m$$, the dimension of the xref/SeqProperty/Range/range/$$ space for$italic f$$. It specifies the component of latex F$$ that we are computing the derivative of. $head dw$$The result italic dw$$ has prototype$syntax% %Vector% %dw% %$$(see xref/RevOne/Vector/Vector/$$ below) and its size is $italic n$$, the dimension of the xref/SeqProperty/Domain/domain/$$ space for$italic f$$. The value of italic dw$$ is the derivative of $latex F_i$$evaluated at italic x$$; i.e., for$latex j = 0 , \ldots , n - 1 $$latex $. dw[ j ] = \D{ F_i }{ x_j } ( x )$$$ $head Vector$$The type italic Vector$$ must be a$xref/SimpleVector/$$class with xref/SimpleVector/Elements of Specified Type/elements of type/$$ $italic Base$$. The routine xref/CheckSimpleVector/$$ will generate an error message if this is not the case.$head RevOne Uses Forward$$After each call to xref/Forward/$$, the object $italic f$$contains the corresponding xref/glossary/Taylor Coefficient/Taylor coefficients/$$. After$code RevOne$$, the previous calls to xref/Forward/$$ are undefined. $head Example$$children% example/rev_one.cpp %$$ The routine$xref/RevOne.cpp//RevOne/$$is both an example and test. It returns code true$$, if it succeeds and $code false$$otherwise.$end ----------------------------------------------------------------------------- */ // BEGIN CppAD namespace namespace CppAD { template template Vector ADFun::RevOne(const Vector &x, size_t i) { size_t i1; size_t n = Domain(); size_t m = Range(); // check Vector is Simple Vector class with Base type elements CheckSimpleVector(); CPPAD_ASSERT_KNOWN( x.size() == n, "RevOne: Length of x not equal domain dimension for f" ); CPPAD_ASSERT_KNOWN( i < m, "RevOne: the index i is not less than range dimension for f" ); // point at which we are evaluating the derivative Forward(0, x); // component which are are taking the derivative of Vector w(m); for(i1 = 0; i1 < m; i1++) w[i1] = 0.; w[i] = Base(1); // dimension the return value Vector dw(n); // compute the return value dw = Reverse(1, w); return dw; } } // END CppAD namespace # endif