virtual void SetUp() { // use a special object for source code generation using Base = double; using CGD = CG<Base>; using ADCG = AD<CGD>; using ADD = AD<Base>; std::vector<ADD> ax(n); std::vector<ADD> ay(m); for (size_t j = 0; j < n; j++) { x[j] = j + 2; ax[j] = x[j]; } // independent variables std::vector<ADCG> u(n); for (size_t j = 0; j < n; j++) { u[j] = x[j]; } CppAD::Independent(u); // dependent variable vector std::vector<ADCG> Z(m); _atomicFun = new checkpoint<double>("func", testModel, ax, ay); // the normal atomic function _cgAtomicFun = new CGAtomicFun<double>(*_atomicFun, x, true); // a wrapper used to tape with CG<Base> (*_cgAtomicFun)(u, Z); // create f: U -> Z and vectors used for derivative calculations _fun = new ADFun<CGD>(u, Z); /** * Create the dynamic library * (generate and compile source code) */ ModelCSourceGen<double> compHelp(*_fun, MODEL_NAME); compHelp.setCreateForwardZero(true); compHelp.setCreateForwardOne(true); compHelp.setCreateReverseOne(true); compHelp.setCreateReverseTwo(true); compHelp.setCreateJacobian(true); compHelp.setCreateHessian(true); compHelp.setCreateSparseJacobian(true); compHelp.setCreateSparseHessian(true); ModelLibraryCSourceGen<double> compDynHelp(compHelp); SaveFilesModelLibraryProcessor<double>::saveLibrarySourcesTo(compDynHelp, MODEL_NAME); DynamicModelLibraryProcessor<double> p(compDynHelp); GccCompiler<double> compiler; prepareTestCompilerFlags(compiler); _dynamicLib = p.createDynamicLibrary(compiler); _model = _dynamicLib->model(MODEL_NAME); _model->addAtomicFunction(*_atomicFun); }
virtual void SetUp() { // use a special object for source code generation typedef double Base; typedef CG<Base> CGD; typedef AD<CGD> ADCG; #ifdef _MODEL1 for (size_t j = 0; j < n; j++) x[j] = j + 2; #else x[0] = 0.5; #endif // independent variables std::vector<ADCG> u(n); for (size_t j = 0; j < n; j++) u[j] = x[j]; CppAD::Independent(u); // dependent variable vector std::vector<ADCG> Z(m); /** * create the CppAD tape as usual */ #ifdef _MODEL1 Z[0] = cos(u[0]); Z[1] = u[1] * u[2] + sin(u[0]); Z[2] = u[2] * u[2] + sin(u[1]); Z[3] = u[0] / u[2] + u[1] * u[2] + 5.0; #else Z[0] = 1.0 / u[0]; #endif // create f: U -> Z and vectors used for derivative calculations _fun = new ADFun<CGD>(u, Z); /** * Create the dynamic library * (generate and compile source code) */ ModelCSourceGen<double> compHelp(*_fun, _modelName); compHelp.setCreateForwardZero(true); compHelp.setCreateForwardOne(true); compHelp.setCreateReverseOne(true); compHelp.setCreateReverseTwo(true); compHelp.setCreateSparseJacobian(true); compHelp.setCreateSparseHessian(true); GccCompiler<double> compiler; prepareTestCompilerFlags(compiler); ModelLibraryCSourceGen<double> compDynHelp(compHelp); DynamicModelLibraryProcessor<double> p(compDynHelp); _dynamicLib = p.createDynamicLibrary(compiler); _model = _dynamicLib->model(_modelName); // dimensions ASSERT_EQ(_model->Domain(), _fun->Domain()); ASSERT_EQ(_model->Range(), _fun->Range()); }