00001 # ifndef CPPAD_FORWARD_INCLUDED
00002 # define CPPAD_FORWARD_INCLUDED
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 # include <cppad/local/cap_taylor.hpp>
00032
00033
00034 namespace CppAD {
00035
00036 template <typename Base>
00037 template <typename Vector>
00038 Vector ADFun<Base>::Forward(size_t p, const Vector &up)
00039 {
00040 size_t i, j;
00041
00042
00043 size_t n = ind_taddr.size();
00044
00045
00046 size_t m = dep_taddr.size();
00047
00048
00049 CheckSimpleVector<Base, Vector>();
00050
00051 CPPAD_ASSERT_KNOWN(
00052 up.size() == n,
00053 "Second argument to Forward does not have length equal to\n"
00054 "the dimension of the domain for the corresponding ADFun."
00055 );
00056 CPPAD_ASSERT_KNOWN(
00057 p <= taylor_per_var,
00058 "The number of Taylor coefficient currently stored\n"
00059 "in this ADFun object is less than p."
00060 );
00061
00062
00063 if( TaylorColDim <= p )
00064 capacity_taylor(p + 1);
00065 CPPAD_ASSERT_UNKNOWN( TaylorColDim > p );
00066
00067
00068 for(j = 0; j < n; j++)
00069 { CPPAD_ASSERT_UNKNOWN( ind_taddr[j] < totalNumVar );
00070
00071
00072 CPPAD_ASSERT_UNKNOWN( Rec.GetOp( ind_taddr[j] ) == InvOp );
00073
00074
00075 Taylor[ind_taddr[j] * TaylorColDim + p] = up[j];
00076 }
00077
00078
00079 compareChange = ForwardSweep(
00080 true, p, totalNumVar, &Rec, TaylorColDim, Taylor
00081 );
00082
00083
00084 Vector vp(m);
00085 for(i = 0; i < m; i++)
00086 { CPPAD_ASSERT_UNKNOWN( dep_taddr[i] < totalNumVar );
00087 vp[i] = Taylor[dep_taddr[i] * TaylorColDim + p];
00088 }
00089
00090
00091 taylor_per_var = p + 1;
00092
00093 return vp;
00094 }
00095
00096 }
00097
00098
00099 # endif