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