vector class, elements of type bool
| 25 | // define the template function BoolCases<Vector> |
| 26 | template <class Vector> // vector class, elements of type bool |
| 27 | bool BoolCases(void) |
| 28 | { bool ok = true; |
| 29 | using CppAD::AD; |
| 30 | |
| 31 | // domain space vector |
| 32 | size_t n = 2; |
| 33 | CPPAD_TESTVECTOR(AD<double>) X(n); |
| 34 | X[0] = 0.; |
| 35 | X[1] = 1.; |
| 36 | |
| 37 | // declare independent variables and start recording |
| 38 | CppAD::Independent(X); |
| 39 | |
| 40 | // range space vector |
| 41 | size_t m = 3; |
| 42 | CPPAD_TESTVECTOR(AD<double>) Y(m); |
| 43 | Y[0] = X[0]; |
| 44 | Y[1] = X[0] * X[1]; |
| 45 | Y[2] = X[1]; |
| 46 | |
| 47 | // create f: X -> Y and stop tape recording |
| 48 | CppAD::ADFun<double> f(X, Y); |
| 49 | |
| 50 | // sparsity pattern for the identity matrix |
| 51 | Vector r(n * n); |
| 52 | size_t i, j; |
| 53 | for(i = 0; i < n; i++) |
| 54 | { for(j = 0; j < n; j++) |
| 55 | r[ i * n + j ] = (i == j); |
| 56 | } |
| 57 | |
| 58 | // sparsity pattern for F'(x) |
| 59 | Vector s(m * n); |
| 60 | s = f.ForSparseJac(n, r); |
| 61 | |
| 62 | // check values |
| 63 | ok &= (s[ 0 * n + 0 ] == true); // Y[0] does depend on X[0] |
| 64 | ok &= (s[ 0 * n + 1 ] == false); // Y[0] does not depend on X[1] |
| 65 | ok &= (s[ 1 * n + 0 ] == true); // Y[1] does depend on X[0] |
| 66 | ok &= (s[ 1 * n + 1 ] == true); // Y[1] does depend on X[1] |
| 67 | ok &= (s[ 2 * n + 0 ] == false); // Y[2] does not depend on X[0] |
| 68 | ok &= (s[ 2 * n + 1 ] == true); // Y[2] does depend on X[1] |
| 69 | |
| 70 | // check that values are stored |
| 71 | ok &= (f.size_forward_bool() > 0); |
| 72 | ok &= (f.size_forward_set() == 0); |
| 73 | |
| 74 | // sparsity pattern for F'(x)^T, note R is the identity, so R^T = R |
| 75 | bool transpose = true; |
| 76 | Vector st(n * m); |
| 77 | st = f.ForSparseJac(n, r, transpose); |
| 78 | |
| 79 | // check values |
| 80 | ok &= (st[ 0 * m + 0 ] == true); // Y[0] does depend on X[0] |
| 81 | ok &= (st[ 1 * m + 0 ] == false); // Y[0] does not depend on X[1] |
| 82 | ok &= (st[ 0 * m + 1 ] == true); // Y[1] does depend on X[0] |
| 83 | ok &= (st[ 1 * m + 1 ] == true); // Y[1] does depend on X[1] |
| 84 | ok &= (st[ 0 * m + 2 ] == false); // Y[2] does not depend on X[0] |
nothing calls this directly
no test coverage detected