Beispiel #1
0
bool mul_level(void)
{	bool ok = true;
	using CppAD::checkpoint;
	using CppAD::ADFun;
	using CppAD::Independent;

	// domain dimension for this problem
	size_t n = 10;
	size_t m = 1;

	// checkpoint version of the function F(x)
	a2vector a2x(n), a2y(m);
	for(size_t j = 0; j < n; j++)
		a2x[j] = a2double(j + 1);
	//
	// could also use bool_sparsity_enum or set_sparsity_enum
	checkpoint<a1double> atom_f("atom_f", f_algo, a2x, a2y);
	//
	// Record a version of y = f(x) without checkpointing
	Independent(a2x);
	f_algo(a2x, a2y);
	ADFun<a1double> check_not(a2x, a2y);
	//
	// number of variables in a tape of f_algo that does not use checkpointing
	size_t size_not = check_not.size_var();
	//
	// Record a version of y = f(x) with checkpointing
	Independent(a2x);
	atom_f(a2x, a2y);
	ADFun<a1double> check_yes(a2x, a2y);
	//
	// f_algo is represented by one atomic operation in this tape
	ok &= check_yes.size_var() < size_not;
	//
	// now record operations at a1double level
	a1vector a1x(n), a1y(m);
	for(size_t j = 0; j < n; j++)
		a1x[j] = a1double(j + 1);
	//
	// without checkpointing
	Independent(a1x);
	a1y = check_not.Forward(0, a1x);
	ADFun<double> with_not(a1x, a1y);
	//
	// should have the same size
	ok &= with_not.size_var() == size_not;
	//
	// with checkpointing
	Independent(a1x);
	a1y = check_yes.Forward(0, a1x);
	ADFun<double> with_yes(a1x, a1y);
	//
	// f_algo is nolonger represented by one atomic operation in this tape
	ok &= with_yes.size_var() == size_not;
	//
	return ok;
}
Beispiel #2
0
bool CompareChange(void)
{   bool ok = true;
    using CppAD::AD;
    using CppAD::ADFun;
    using CppAD::Independent;

    // domain space vector
    size_t n = 2;
    CPPAD_TEST_VECTOR< AD<double> > X(n);
    X[0] = 3.;
    X[1] = 4.;

    // declare independent variables and start tape recording
    CppAD::Independent(X);

    // range space vector
    size_t m = 1;
    CPPAD_TEST_VECTOR< AD<double> > Y(m);
    Y[0] = Minimum(X[0], X[1]);

    // create f: x -> y and stop tape recording
    ADFun<double> f(X, Y);

    // evaluate zero mode Forward where conditional has the same result
    // note that f.CompareChange is not defined when NDEBUG is true
    CPPAD_TEST_VECTOR<double> x(n);
    CPPAD_TEST_VECTOR<double> y(m);
    x[0] = 3.5;
    x[1] = 4.;
    y    = f.Forward(0, x);
    ok  &= (y[0] == x[0]);
    ok  &= (y[0] == Minimum(x[0], x[1]));
    ok  &= (f.CompareChange() == 0);

    // evaluate zero mode Forward where conditional has different result
    x[0] = 4.;
    x[1] = 3.;
    y    = f.Forward(0, x);
    ok  &= (y[0] == x[0]);
    ok  &= (y[0] != Minimum(x[0], x[1]));
    ok  &= (f.CompareChange() == 1);

    // re-tape to obtain the new AD operation sequence
    X[0] = 4.;
    X[1] = 3.;
    Independent(X);
    Y[0] = Minimum(X[0], X[1]);

    // stop tape and store result in f
    f.Dependent(Y);

    // evaluate the function at new argument values
    y    = f.Forward(0, x);
    ok  &= (y[0] == x[1]);
    ok  &= (y[0] == Minimum(x[0], x[1]));
    ok  &= (f.CompareChange() == 0);

    return ok;
}