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);
    }
示例#2
0
    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());
    }