00001 # ifndef CPPAD_AD_FUN_INCLUDED
00002 # define CPPAD_AD_FUN_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 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 namespace CppAD {
00061 
00062 template <class Base>
00063 class ADFun {
00064         
00065         typedef size_t Pack;
00066 
00067 public:
00068         
00069         ADFun(void) 
00070         : totalNumVar(0), Taylor(CPPAD_NULL), ForJac(CPPAD_NULL)
00071         { }
00072 
00073         
00074         template <typename ADvector>
00075         ADFun(const ADvector &x, const ADvector &y);
00076 
00077         
00078         ~ADFun(void)
00079         {       if( Taylor != CPPAD_NULL )
00080                         CPPAD_TRACK_DEL_VEC(Taylor);
00081                 if( ForJac != CPPAD_NULL )
00082                         CPPAD_TRACK_DEL_VEC(ForJac);
00083         }
00084 
00085         
00086         template <typename ADvector>
00087         void Dependent(const ADvector &y);  
00088 
00089         template <typename ADvector>
00090         void Dependent(const ADvector &x, const ADvector &y);
00091 
00092         
00093         template <typename VectorBase>
00094         VectorBase Forward(size_t p, const VectorBase &u);
00095 
00096         
00097         template <typename VectorBase>
00098         VectorBase Reverse(size_t p, const VectorBase &v) const;
00099 
00100         
00101         template <typename VectorBase>
00102         VectorBase ForSparseJac(size_t q, const VectorBase &Px);
00103 
00104         
00105         template <typename VectorBase>
00106         VectorBase RevSparseJac(size_t q, const VectorBase &Py) const;
00107 
00108         
00109         template <typename VectorBase>
00110         VectorBase RevSparseHes(size_t q, const VectorBase &Py) const;
00111 
00112         
00113         bool use_VecAD(void) const
00114         {       return Rec.NumVecInd() > 0; }
00115 
00116         
00117         size_t size_var(void) const
00118         {       return totalNumVar; }
00119 
00120         
00121         size_t size_taylor(void) const
00122         {       return taylor_per_var; } 
00123 
00124         
00125         void capacity_taylor(size_t per_var);   
00126 
00127         
00128         size_t Domain(void) const
00129         {       return ind_taddr.size(); }
00130 
00131         
00132         size_t Range(void) const
00133         {       return dep_taddr.size(); }
00134 
00135         
00136         bool Parameter(size_t i)
00137         {       CPPAD_ASSERT_KNOWN(
00138                         i < dep_taddr.size(),
00139                         "Argument to Parameter is >= dimension of range space"
00140                 );
00141                 return dep_parameter[i]; 
00142         }
00143 
00144 # ifndef NDEBUG
00145         
00146         size_t CompareChange(void) const
00147         {       return compareChange; }
00148 # endif
00149 
00150         
00151         template <typename VectorBase>
00152         VectorBase Jacobian(const VectorBase &x); 
00153 
00154         
00155         template <typename VectorBase>
00156         VectorBase Hessian(const VectorBase &x, size_t i); 
00157 
00158         
00159         template <typename VectorBase>
00160         VectorBase ForOne(
00161                 const VectorBase   &x ,
00162                 size_t              j );
00163 
00164         
00165         template <typename VectorBase>
00166         VectorBase RevOne(
00167                 const VectorBase   &x ,
00168                 size_t              i );
00169 
00170         
00171         template <typename VectorBase, typename VectorSize_t>
00172         VectorBase ForTwo(
00173                 const VectorBase   &x ,
00174                 const VectorSize_t &J ,
00175                 const VectorSize_t &K );
00176 
00177         
00178         template <typename VectorBase, typename VectorSize_t>
00179         VectorBase RevTwo(
00180                 const VectorBase   &x ,
00181                 const VectorSize_t &I ,
00182                 const VectorSize_t &J );
00183 
00184         
00185 
00186         
00187         size_t Size(void) const
00188         {       return totalNumVar; }
00189 
00190         
00191         size_t Order(void) const
00192         {       return taylor_per_var - 1; }
00193 
00194         
00195         size_t Memory(void) const
00196         {       size_t pervar  = TaylorColDim * sizeof(Base)
00197                 + ForJacColDim * sizeof(Pack);
00198                 size_t total   = totalNumVar * pervar + Rec.Memory();
00199                 return total;
00200         }
00201 
00202         
00203         size_t taylor_size(void) const
00204         {       return taylor_per_var; } 
00205         
00206 private:
00207         
00208         
00209 
00210         
00211         size_t compareChange;
00212 
00213         
00214         size_t taylor_per_var;
00215 
00216         
00217         size_t ForJacBitDim; 
00218 
00219         
00220         size_t TaylorColDim;
00221 
00222         
00223         size_t ForJacColDim;
00224 
00225         
00226         size_t totalNumVar;
00227 
00228         
00229         CppAD::vector<size_t> ind_taddr;
00230 
00231         
00232         CppAD::vector<size_t> dep_taddr;
00233         CppAD::vector<bool>   dep_parameter;
00234 
00235         
00236         TapeRec<Base> Rec;
00237 
00238         
00239         Base *Taylor;
00240 
00241         
00242         Pack *ForJac;
00243 
00244 
00245         template <typename ADvector>
00246         void Dependent(ADTape<Base> *tape, const ADvector &y);
00247 };
00248 
00249 
00250 } 
00251 
00252 
00253 # include <cppad/local/forward_sweep.hpp>
00254 # include <cppad/local/reverse_sweep.hpp>
00255 # include <cppad/local/for_jac_sweep.hpp>
00256 # include <cppad/local/rev_jac_sweep.hpp>
00257 # include <cppad/local/rev_hes_sweep.hpp>
00258 
00259 
00260 
00261 # include <cppad/local/independent.hpp>
00262 # include <cppad/local/dependent.hpp>
00263 # include <cppad/local/fun_construct.hpp>
00264 # include <cppad/local/fun_eval.hpp>
00265 # include <cppad/local/drivers.hpp>
00266 # include <cppad/local/fun_check.hpp>
00267 # include <cppad/local/omp_max_thread.hpp>
00268 
00269 # endif