30 #ifndef NESTED_FADUNITTESTS_HPP 31 #define NESTED_FADUNITTESTS_HPP 41 #include <cppunit/extensions/HelperMacros.h> 43 #define COMPARE_VALUES(a, b) \ 44 CPPUNIT_ASSERT( std::abs(a-b) < this->tol_a + this->tol_r*std::abs(a) ); 46 #define COMPARE_FADS(a, b) \ 47 CPPUNIT_ASSERT(a.size() == b.size()); \ 48 CPPUNIT_ASSERT(a.hasFastAccess() == b.hasFastAccess()); \ 49 COMPARE_VALUES(a.val(), b.val()); \ 50 for (int zz=0; zz<a.size(); zz++) { \ 51 COMPARE_VALUES(a.dx(zz), b.dx(zz)); \ 52 COMPARE_VALUES(a.fastAccessDx(zz), b.fastAccessDx(zz)); \ 56 #define COMPARE_NESTED_FADS(a, b) \ 57 CPPUNIT_ASSERT(a.size() == b.size()); \ 58 CPPUNIT_ASSERT(a.hasFastAccess() == b.hasFastAccess()); \ 59 COMPARE_FADS(a.val(), b.val()); \ 60 for (int z=0; z<a.size(); z++) { \ 61 COMPARE_FADS(a.dx(z), b.dx(z)); \ 62 COMPARE_FADS(a.fastAccessDx(z), b.fastAccessDx(z)); \ 66 #define BINARY_OP_TEST(TESTNAME,OP) \ 68 c_dfad = a_dfad OP b_dfad; \ 69 c_fad = a_fad OP b_fad; \ 70 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 72 double val = urand.number(); \ 73 c_dfad = a_dfad OP val; \ 74 c_fad = a_fad OP FadType(val); \ 75 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 77 c_dfad = val OP b_dfad; \ 78 c_fad = FadType(val) OP b_fad; \ 79 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 82 #define RELOP_TEST(TESTNAME,OP) \ 84 bool r1 = a_dfad OP b_dfad; \ 85 bool r2 = a_fad OP b_fad; \ 86 CPPUNIT_ASSERT(r1 == r2); \ 88 double val = urand.number(); \ 90 r2 = a_fad OP FadType(val); \ 91 CPPUNIT_ASSERT(r1 == r2); \ 94 r2 = FadType(val) OP b_fad; \ 95 CPPUNIT_ASSERT(r1 == r2); \ 98 #define BINARY_FUNC_TEST(TESTNAME,FUNC) \ 100 c_dfad = FUNC (a_dfad,b_dfad); \ 101 c_fad = FUNC (a_fad,b_fad); \ 102 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 104 double val = urand.number(); \ 105 c_dfad = FUNC (a_dfad,val); \ 106 c_fad = FUNC (a_fad,FadType(val)); \ 107 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 109 c_dfad = FUNC (val,b_dfad); \ 110 c_fad = FUNC (FadType(val),b_fad); \ 111 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 114 #define UNARY_OP_TEST(TESTNAME,OP) \ 116 c_dfad = OP a_dfad; \ 118 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 121 #define UNARY_FUNC_TEST(TESTNAME,FUNC) \ 123 c_dfad = FUNC (a_dfad); \ 124 c_fad = FUNC (a_fad); \ 125 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 128 #define UNARY_ASSIGNOP_TEST(TESTNAME,OP) \ 132 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 134 double val = urand.number(); \ 136 c_fad OP FadType(val); \ 137 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 141 template <
class FadFadType,
class ScalarType>
197 typedef typename FadFadType::value_type
FadType;
202 ScalarType absolute_tolerance,
203 ScalarType relative_tolerance);
250 template <
typename ScalarT>
264 template <
typename ScalarT>
285 FadFadType aa_dfad =
a_dfad;
286 FAD::Fad< FadType > aa_fad =
a_fad;
289 aa_dfad = aa_dfad +
b_dfad;
290 aa_fad = aa_fad +
b_fad;
295 FadFadType aa_dfad =
a_dfad;
296 FAD::Fad< FadType > aa_fad =
a_fad;
299 aa_dfad = aa_dfad -
b_dfad;
300 aa_fad = aa_fad -
b_fad;
305 FadFadType aa_dfad =
a_dfad;
306 FAD::Fad< FadType > aa_fad =
a_fad;
309 aa_dfad = aa_dfad *
b_dfad;
310 aa_fad = aa_fad *
b_fad;
315 FadFadType aa_dfad =
a_dfad;
316 FAD::Fad< FadType > aa_fad =
a_fad;
319 aa_dfad = aa_dfad /
b_dfad;
320 aa_fad = aa_fad /
b_fad;
346 template <
class FadFadType,
class ScalarType>
349 urand(0.0, 1.0, 123456), n1(5), n2(3), tol_a(1.0e-15), tol_r(1.0e-14) {}
351 template <
class FadFadType,
class ScalarType>
354 ScalarType absolute_tolerance,
355 ScalarType relative_tolerance) :
356 urand(0.0, 1.0, 123456),
359 tol_a(absolute_tolerance),
360 tol_r(relative_tolerance) {}
362 template <
class FadFadType,
class ScalarType>
366 val = urand.number();
368 a_fad = FAD::Fad<FadType>(n1,
FadType(n2,
val));
370 val = urand.number();
372 b_fad = FAD::Fad<FadType>(n1,
FadType(n2,
val));
374 for (
int j=0; j<n2; j++) {
376 val2 = urand.number();
377 a_dfad.val().fastAccessDx(j) = val2;
378 a_fad.val().fastAccessDx(j) = val2;
380 val2 = urand.number();
381 b_dfad.val().fastAccessDx(j) = val2;
382 b_fad.val().fastAccessDx(j) = val2;
385 for (
int i=0; i<n1; i++) {
386 val = urand.number();
390 val = urand.number();
394 for (
int j=0; j<n2; j++) {
396 val2 = urand.number();
397 a_dfad.fastAccessDx(i).fastAccessDx(j) = val2;
398 a_fad.fastAccessDx(i).fastAccessDx(j) = val2;
400 val2 = urand.number();
401 b_dfad.fastAccessDx(i).fastAccessDx(j) = val2;
402 b_fad.fastAccessDx(i).fastAccessDx(j) = val2;
407 template <
class FadFadType,
class ScalarType>
411 template <
class FadFadType,
class ScalarType>
416 FadFadType aa_dfad = a_dfad + 1.0;
417 c_dfad =
max(aa_dfad, a_dfad);
419 for (
int i=0; i<n1; i++) {
421 COMPARE_FADS(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
424 c_dfad =
max(a_dfad, aa_dfad);
426 for (
int i=0; i<n1; i++) {
428 COMPARE_FADS(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
431 c_dfad =
max(a_dfad+1.0, a_dfad);
433 for (
int i=0; i<n1; i++) {
435 COMPARE_FADS(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
438 c_dfad =
max(a_dfad, a_dfad+1.0);
440 for (
int i=0; i<n1; i++) {
442 COMPARE_FADS(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
445 val = a_dfad.val() + 1;
446 c_dfad =
max(a_dfad,
val);
448 for (
int i=0; i<n1; i++) {
452 val = a_dfad.val() - 1;
453 c_dfad =
max(a_dfad,
val);
455 for (
int i=0; i<n1; i++) {
457 COMPARE_FADS(c_dfad.fastAccessDx(i), a_dfad.fastAccessDx(i));
460 val = b_dfad.val() + 1;
461 c_dfad =
max(
val, b_dfad);
463 for (
int i=0; i<n1; i++) {
467 val = b_dfad.val() - 1;
468 c_dfad =
max(
val, b_dfad);
470 for (
int i=0; i<n1; i++) {
472 COMPARE_FADS(c_dfad.fastAccessDx(i), b_dfad.fastAccessDx(i));
476 template <
class FadFadType,
class ScalarType>
481 FadFadType aa_dfad = a_dfad - 1.0;
482 c_dfad =
min(aa_dfad, a_dfad);
484 for (
int i=0; i<n1; i++) {
486 COMPARE_FADS(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
489 c_dfad =
min(a_dfad, aa_dfad);
491 for (
int i=0; i<n1; i++) {
493 COMPARE_FADS(c_dfad.fastAccessDx(i), aa_dfad.fastAccessDx(i));
496 val = a_dfad.val() - 1;
497 c_dfad =
min(a_dfad,
val);
499 for (
int i=0; i<n1; i++) {
503 val = a_dfad.val() + 1;
504 c_dfad =
min(a_dfad,
val);
506 for (
int i=0; i<n1; i++) {
508 COMPARE_FADS(c_dfad.fastAccessDx(i), a_dfad.fastAccessDx(i));
511 val = b_dfad.val() - 1;
512 c_dfad =
min(
val, b_dfad);
514 for (
int i=0; i<n1; i++) {
518 val = b_dfad.val() + 1;
519 c_dfad =
min(
val, b_dfad);
521 for (
int i=0; i<n1; i++) {
523 COMPARE_FADS(c_dfad.fastAccessDx(i), b_dfad.fastAccessDx(i));
527 #undef COMPARE_VALUES 529 #undef COMPARE_NESTED_FADS 531 #endif // NESETD_FADUNITTESTS_HPP ScalarT composite1(const ScalarT &a, const ScalarT &b)
#define COMPARE_FADS(a, b)
UNARY_OP_TEST(testUnaryPlus,+)
FAD::Fad< FadType > a_fad
Sacado::Fad::DFad< double > FadType
pow(expr1.val(), expr2.val())
BINARY_FUNC_TEST(testPow, pow)
FAD::Fad< FadType > b_fad
BINARY_OP_TEST(testAddition,+)
FAD::Fad< FadType > c_fad
#define COMPARE_NESTED_FADS(a, b)
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
CPPUNIT_TEST(testAddition)
UNARY_FUNC_TEST(testExp, exp)
Sacado::Random< ScalarType > urand
UNARY_ASSIGNOP_TEST(testPlusEquals,+=)
FadFadType::value_type FadType
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
ScalarT composite1_fad(const ScalarT &a, const ScalarT &b)
RELOP_TEST(testEquals,==)
CPPUNIT_TEST_SUITE(FadFadOpsUnitTest)