32 #ifndef FADUNITTESTS_HPP 33 #define FADUNITTESTS_HPP 43 #include <cppunit/extensions/HelperMacros.h> 45 #define COMPARE_VALUES(a, b) \ 46 CPPUNIT_ASSERT( std::abs(a-b) < this->tol_a + this->tol_r*std::abs(a) ); 48 #define COMPARE_FADS(a, b) \ 49 CPPUNIT_ASSERT(a.size() == b.size()); \ 50 CPPUNIT_ASSERT(a.hasFastAccess() == b.hasFastAccess()); \ 51 COMPARE_VALUES(a.val(), b.val()); \ 52 for (int i=0; i<a.size(); i++) { \ 53 COMPARE_VALUES(a.dx(i), b.dx(i)); \ 54 COMPARE_VALUES(a.fastAccessDx(i), b.fastAccessDx(i)); \ 58 #define BINARY_OP_TEST(TESTNAME,OP) \ 60 c_dfad = a_dfad OP b_dfad; \ 61 c_fad = a_fad OP b_fad; \ 62 COMPARE_FADS(c_dfad, c_fad); \ 64 double val = urand.number(); \ 65 c_dfad = a_dfad OP val; \ 66 c_fad = a_fad OP val; \ 67 COMPARE_FADS(c_dfad, c_fad); \ 69 c_dfad = val OP b_dfad; \ 70 c_fad = val OP b_fad; \ 71 COMPARE_FADS(c_dfad, c_fad); \ 74 #define RELOP_TEST(TESTNAME,OP) \ 76 bool r1 = a_dfad OP b_dfad; \ 77 bool r2 = a_fad OP b_fad; \ 78 CPPUNIT_ASSERT(r1 == r2); \ 80 double val = urand.number(); \ 83 CPPUNIT_ASSERT(r1 == r2); \ 87 CPPUNIT_ASSERT(r1 == r2); \ 90 #define BINARY_FUNC_TEST(TESTNAME,FUNC) \ 92 c_dfad = FUNC (a_dfad,b_dfad); \ 93 c_fad = FUNC (a_fad,b_fad); \ 94 COMPARE_FADS(c_dfad, c_fad); \ 96 double val = urand.number(); \ 97 c_dfad = FUNC (a_dfad,val); \ 98 c_fad = FUNC (a_fad,val); \ 99 COMPARE_FADS(c_dfad, c_fad); \ 101 c_dfad = FUNC (val,b_dfad); \ 102 c_fad = FUNC (val,b_fad); \ 103 COMPARE_FADS(c_dfad, c_fad); \ 106 #define UNARY_OP_TEST(TESTNAME,OP) \ 108 c_dfad = OP a_dfad; \ 110 COMPARE_FADS(c_dfad, c_fad); \ 113 #define UNARY_FUNC_TEST(TESTNAME,FUNC) \ 115 c_dfad = FUNC (a_dfad); \ 116 c_fad = FUNC (a_fad); \ 117 COMPARE_FADS(c_dfad, c_fad); \ 120 #define UNARY_ASSIGNOP_TEST(TESTNAME,OP) \ 124 COMPARE_FADS(c_dfad, c_fad); \ 126 double val = urand.number(); \ 129 COMPARE_FADS(c_dfad, c_fad); \ 133 template <
class FadType,
class ScalarType>
194 ScalarType relative_tolerance);
241 template <
typename ScalarT>
263 FAD::Fad<ScalarType> aa_fad =
a_fad;
266 aa_dfad = aa_dfad +
b_dfad;
267 aa_fad = aa_fad +
b_fad;
273 FAD::Fad<ScalarType> aa_fad =
a_fad;
276 aa_dfad = aa_dfad -
b_dfad;
277 aa_fad = aa_fad -
b_fad;
283 FAD::Fad<ScalarType> aa_fad =
a_fad;
286 aa_dfad = aa_dfad *
b_dfad;
287 aa_fad = aa_fad *
b_fad;
293 FAD::Fad<ScalarType> aa_fad =
a_fad;
296 aa_dfad = aa_dfad /
b_dfad;
297 aa_fad = aa_fad /
b_fad;
307 for (
int i=0; i<
n; ++i)
312 for (
int i=0; i<
n; ++i)
313 cc.fastAccessDx(i) = b.val()*
pow(
a.val(),b.val()-1)*
a.dx(i);
324 for (
int i=0; i<
n; ++i)
325 cc.fastAccessDx(i) = 0.0;
337 for (
int i=0; i<
n; ++i)
338 cc.fastAccessDx(i) = 0.0;
349 for (
int i=0; i<
n; ++i)
350 cc.fastAccessDx(i) = 0.0;
377 template <
class FadType,
class ScalarType>
380 urand(), n(5), tol_a(1.0e-15), tol_r(1.0e-12) {}
382 template <
class FadType,
class ScalarType>
385 ScalarType relative_tolerance) :
388 tol_a(absolute_tolerance),
389 tol_r(relative_tolerance) {}
391 template <
class FadType,
class ScalarType>
395 val = urand.number();
397 a_fad = FAD::Fad<ScalarType>(n,
val);
399 val = urand.number();
401 b_fad = FAD::Fad<ScalarType>(n,
val);
403 for (
int i=0; i<n; i++) {
404 val = urand.number();
405 a_dfad.fastAccessDx(i) =
val;
406 a_fad.fastAccessDx(i) =
val;
408 val = urand.number();
409 b_dfad.fastAccessDx(i) =
val;
410 b_fad.fastAccessDx(i) =
val;
414 template <
class FadType,
class ScalarType>
418 template <
class FadType,
class ScalarType>
423 FadType aa_dfad = a_dfad + 1.0;
424 c_dfad =
max(aa_dfad, a_dfad);
426 for (
int i=0; i<n; i++) {
431 c_dfad =
max(a_dfad, aa_dfad);
433 for (
int i=0; i<n; i++) {
438 c_dfad =
max(a_dfad+1.0, a_dfad);
440 for (
int i=0; i<n; i++) {
445 c_dfad =
max(a_dfad, a_dfad+1.0);
447 for (
int i=0; i<n; i++) {
452 val = a_dfad.val() + 1;
453 c_dfad =
max(a_dfad,
val);
455 for (
int i=0; i<n; i++)
458 val = a_dfad.val() - 1;
459 c_dfad =
max(a_dfad,
val);
461 for (
int i=0; i<n; i++) {
466 val = b_dfad.val() + 1;
467 c_dfad =
max(
val, b_dfad);
469 for (
int i=0; i<n; i++)
472 val = b_dfad.val() - 1;
473 c_dfad =
max(
val, b_dfad);
475 for (
int i=0; i<n; i++) {
481 template <
class FadType,
class ScalarType>
486 FadType aa_dfad = a_dfad - 1.0;
487 c_dfad =
min(aa_dfad, a_dfad);
489 for (
int i=0; i<n; i++) {
494 c_dfad =
min(a_dfad, aa_dfad);
496 for (
int i=0; i<n; i++) {
501 val = a_dfad.val() - 1;
502 c_dfad =
min(a_dfad,
val);
504 for (
int i=0; i<n; i++)
507 val = a_dfad.val() + 1;
508 c_dfad =
min(a_dfad,
val);
510 for (
int i=0; i<n; i++) {
515 val = b_dfad.val() - 1;
516 c_dfad =
min(
val, b_dfad);
518 for (
int i=0; i<n; i++)
521 val = b_dfad.val() + 1;
522 c_dfad =
min(
val, b_dfad);
524 for (
int i=0; i<n; i++) {
530 #undef COMPARE_VALUES 533 #endif // FADUNITTESTS_HPP RELOP_TEST(testEquals,==)
UNARY_FUNC_TEST(testExp, exp)
Sacado::Fad::DFad< double > FadType
ScalarT number()
Get random number.
BINARY_OP_TEST(testAddition,+)
ScalarT composite1(const ScalarT &a, const ScalarT &b)
KOKKOS_INLINE_FUNCTION mpl::enable_if_c< ExprLevel< Expr< T1 > >::value==ExprLevel< Expr< T2 > >::value, Expr< PowerOp< Expr< T1 >, Expr< T2 > > > >::type pow(const Expr< T1 > &expr1, const Expr< T2 > &expr2)
UNARY_ASSIGNOP_TEST(testPlusEquals,+=)
#define COMPARE_FADS(a, b)
expr expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c *expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr1 c expr2 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 expr2 expr1 expr2 expr1 expr1 expr1 c
CPPUNIT_TEST(testAddition)
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
FAD::Fad< ScalarType > b_fad
FAD::Fad< ScalarType > a_fad
FAD::Fad< ScalarType > c_fad
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
CPPUNIT_TEST_SUITE(FadOpsUnitTest)
BINARY_FUNC_TEST(testPow, pow)
Sacado::Random< ScalarType > urand
#define COMPARE_VALUES(a, b)
UNARY_OP_TEST(testUnaryPlus,+)