30 #ifndef NESTED_FADUNITTESTS_HPP 31 #define NESTED_FADUNITTESTS_HPP 46 template <
class FadFadType>
83 for (
int j=0; j<
n2; j++) {
85 val2 =
urand.number();
86 a_dfad_.val().fastAccessDx(j) = val2;
87 a_fad_.val().fastAccessDx(j) = val2;
89 val2 =
urand.number();
90 b_dfad_.val().fastAccessDx(j) = val2;
91 b_fad_.val().fastAccessDx(j) = val2;
94 for (
int i=0;
i<
n1;
i++) {
103 for (
int j=0; j<
n2; j++) {
105 val2 =
urand.number();
106 a_dfad_.fastAccessDx(
i).fastAccessDx(j) = val2;
107 a_fad_.fastAccessDx(
i).fastAccessDx(j) = val2;
109 val2 =
urand.number();
110 b_dfad_.fastAccessDx(
i).fastAccessDx(j) = val2;
111 b_fad_.fastAccessDx(
i).fastAccessDx(j) = val2;
122 template <
typename ScalarT>
136 template <
typename ScalarT>
154 #define BINARY_OP_TEST(FIXTURENAME,TESTNAME,OP) \ 155 TYPED_TEST_P(FIXTURENAME, TESTNAME) { \ 156 typedef decltype(this->a_dfad_) FadFadType; \ 157 typedef typename Sacado::ValueType<FadFadType>::type FadType; \ 158 auto a_dfad = this->a_dfad_; \ 159 auto b_dfad = this->b_dfad_; \ 160 auto c_dfad = this->c_dfad_; \ 161 auto a_fad = this->a_fad_; \ 162 auto b_fad = this->b_fad_; \ 163 auto c_fad = this->c_fad_; \ 164 c_dfad = a_dfad OP b_dfad; \ 165 c_fad = a_fad OP b_fad; \ 166 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 168 double val = this->urand.number(); \ 169 c_dfad = a_dfad OP val; \ 170 c_fad = a_fad OP FadType(val); \ 171 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 173 c_dfad = val OP b_dfad; \ 174 c_fad = FadType(val) OP b_fad; \ 175 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 178 #define RELOP_TEST(FIXTURENAME,TESTNAME,OP) \ 179 TYPED_TEST_P(FIXTURENAME, TESTNAME) { \ 180 typedef decltype(this->a_dfad_) FadFadType; \ 181 typedef typename Sacado::ValueType<FadFadType>::type FadType; \ 182 auto a_dfad = this->a_dfad_; \ 183 auto b_dfad = this->b_dfad_; \ 184 auto a_fad = this->a_fad_; \ 185 auto b_fad = this->b_fad_; \ 186 bool r1 = a_dfad OP b_dfad; \ 187 bool r2 = a_fad OP b_fad; \ 188 ASSERT_TRUE(r1 == r2); \ 190 double val = this->urand.number(); \ 191 r1 = a_dfad OP val; \ 192 r2 = a_fad OP FadType(val); \ 193 ASSERT_TRUE(r1 == r2); \ 195 r1 = val OP b_dfad; \ 196 r2 = FadType(val) OP b_fad; \ 197 ASSERT_TRUE(r1 == r2); \ 200 #define BINARY_FUNC_TEST(FIXTURENAME,TESTNAME,FUNC) \ 201 TYPED_TEST_P(FIXTURENAME, TESTNAME) { \ 202 typedef decltype(this->a_dfad_) FadFadType; \ 203 typedef typename Sacado::ValueType<FadFadType>::type FadType; \ 204 auto a_dfad = this->a_dfad_; \ 205 auto b_dfad = this->b_dfad_; \ 206 auto c_dfad = this->c_dfad_; \ 207 auto a_fad = this->a_fad_; \ 208 auto b_fad = this->b_fad_; \ 209 auto c_fad = this->c_fad_; \ 210 c_dfad = FUNC (a_dfad,b_dfad); \ 211 c_fad = FUNC (a_fad,b_fad); \ 212 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 214 double val = this->urand.number(); \ 215 c_dfad = FUNC (a_dfad,val); \ 216 c_fad = FUNC (a_fad,FadType(val)); \ 217 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 219 c_dfad = FUNC (val,b_dfad); \ 220 c_fad = FUNC (FadType(val),b_fad); \ 221 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 224 #define UNARY_OP_TEST(FIXTURENAME,TESTNAME,OP) \ 225 TYPED_TEST_P(FIXTURENAME, TESTNAME) { \ 226 auto a_dfad = this->a_dfad_; \ 227 auto c_dfad = this->c_dfad_; \ 228 auto a_fad = this->a_fad_; \ 229 auto c_fad = this->c_fad_; \ 230 c_dfad = OP a_dfad; \ 232 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 235 #define UNARY_FUNC_TEST(FIXTURENAME,TESTNAME,FUNC) \ 236 TYPED_TEST_P(FIXTURENAME, TESTNAME) { \ 237 auto a_dfad = this->a_dfad_; \ 238 auto c_dfad = this->c_dfad_; \ 239 auto a_fad = this->a_fad_; \ 240 auto c_fad = this->c_fad_; \ 241 c_dfad = FUNC (a_dfad); \ 242 c_fad = FUNC (a_fad); \ 243 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 246 #define UNARY_ASSIGNOP_TEST(FIXTURENAME,TESTNAME,OP) \ 247 TYPED_TEST_P(FIXTURENAME, TESTNAME){ \ 248 auto a_dfad = this->a_dfad_; \ 249 auto b_dfad = this->b_dfad_; \ 250 auto c_dfad = this->c_dfad_; \ 251 auto a_fad = this->a_fad_; \ 252 auto b_fad = this->b_fad_; \ 253 auto c_fad = this->c_fad_; \ 258 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 260 double val = this->urand.number(); \ 263 COMPARE_NESTED_FADS(c_dfad, c_fad); \ 305 typedef decltype(this->a_dfad_) FadFadType;
310 auto a_dfad = this->a_dfad_;
311 auto b_dfad = this->b_dfad_;
312 auto c_dfad = this->c_dfad_;
313 auto a_fad = this->a_fad_;
314 auto b_fad = this->b_fad_;
315 auto c_fad = this->c_fad_;
317 FadFadType aa_dfad = a_dfad + 1.0;
318 c_dfad =
max(aa_dfad, a_dfad);
320 for (
int i=0;
i<this->n1;
i++) {
325 c_dfad =
max(a_dfad, aa_dfad);
327 for (
int i=0;
i<this->n1;
i++) {
332 c_dfad =
max(a_dfad+1.0, a_dfad);
334 for (
int i=0;
i<this->n1;
i++) {
339 c_dfad =
max(a_dfad, a_dfad+1.0);
341 for (
int i=0;
i<this->n1;
i++) {
346 val = a_dfad.val() + 1;
347 c_dfad =
max(a_dfad,
val);
349 for (
int i=0;
i<this->n1;
i++) {
353 val = a_dfad.val() - 1;
354 c_dfad =
max(a_dfad,
val);
356 for (
int i=0;
i<this->n1;
i++) {
361 val = b_dfad.val() + 1;
362 c_dfad =
max(
val, b_dfad);
364 for (
int i=0;
i<this->n1;
i++) {
368 val = b_dfad.val() - 1;
369 c_dfad =
max(
val, b_dfad);
371 for (
int i=0;
i<this->n1;
i++) {
378 typedef decltype(this->a_dfad_) FadFadType;
383 auto a_dfad = this->a_dfad_;
384 auto b_dfad = this->b_dfad_;
385 auto c_dfad = this->c_dfad_;
386 auto a_fad = this->a_fad_;
387 auto b_fad = this->b_fad_;
388 auto c_fad = this->c_fad_;
390 FadFadType aa_dfad = a_dfad - 1.0;
391 c_dfad =
min(aa_dfad, a_dfad);
393 for (
int i=0;
i<this->n1;
i++) {
398 c_dfad =
min(a_dfad, aa_dfad);
400 for (
int i=0;
i<this->n1;
i++) {
405 val = a_dfad.val() - 1;
406 c_dfad =
min(a_dfad,
val);
408 for (
int i=0;
i<this->n1;
i++) {
412 val = a_dfad.val() + 1;
413 c_dfad =
min(a_dfad,
val);
415 for (
int i=0;
i<this->n1;
i++) {
420 val = b_dfad.val() - 1;
421 c_dfad =
min(
val, b_dfad);
423 for (
int i=0;
i<this->n1;
i++) {
427 val = b_dfad.val() + 1;
428 c_dfad =
min(
val, b_dfad);
430 for (
int i=0;
i<this->n1;
i++) {
437 auto a_dfad = this->a_dfad_;
438 auto b_dfad = this->b_dfad_;
439 auto c_dfad = this->c_dfad_;
440 auto a_fad = this->a_fad_;
441 auto b_fad = this->b_fad_;
442 auto c_fad = this->c_fad_;
444 c_dfad = this->composite1(a_dfad, b_dfad);
445 c_fad = this->composite1_fad(a_fad, b_fad);
450 typedef decltype(this->a_dfad_) FadFadType;
453 auto a_dfad = this->a_dfad_;
454 auto b_dfad = this->b_dfad_;
455 auto a_fad = this->a_fad_;
456 auto b_fad = this->b_fad_;
458 FadFadType aa_dfad = a_dfad;
459 FAD::Fad< FadType > aa_fad = a_fad;
462 aa_dfad = aa_dfad + b_dfad;
463 aa_fad = aa_fad + b_fad;
468 typedef decltype(this->a_dfad_) FadFadType;
471 auto a_dfad = this->a_dfad_;
472 auto b_dfad = this->b_dfad_;
473 auto a_fad = this->a_fad_;
474 auto b_fad = this->b_fad_;
476 FadFadType aa_dfad = a_dfad;
477 FAD::Fad< FadType > aa_fad = a_fad;
480 aa_dfad = aa_dfad - b_dfad;
481 aa_fad = aa_fad - b_fad;
486 typedef decltype(this->a_dfad_) FadFadType;
489 auto a_dfad = this->a_dfad_;
490 auto b_dfad = this->b_dfad_;
491 auto a_fad = this->a_fad_;
492 auto b_fad = this->b_fad_;
494 FadFadType aa_dfad = a_dfad;
495 FAD::Fad< FadType > aa_fad = a_fad;
498 aa_dfad = aa_dfad * b_dfad;
499 aa_fad = aa_fad * b_fad;
504 typedef decltype(this->a_dfad_) FadFadType;
507 auto a_dfad = this->a_dfad_;
508 auto b_dfad = this->b_dfad_;
509 auto a_fad = this->a_fad_;
510 auto b_fad = this->b_fad_;
512 FadFadType aa_dfad = a_dfad;
513 FAD::Fad< FadType > aa_fad = a_fad;
516 aa_dfad = aa_dfad / b_dfad;
517 aa_fad = aa_fad / b_fad;
523 typedef decltype(this->a_dfad_) FadFadType;
527 auto a_dfad = this->a_dfad_;
529 FadFadType
a, b,
c, cc;
535 ScalarType f =
pow(
a.val().val(), b.val().val());
536 ScalarType fp = b.val().val()*
pow(
a.val().val(),b.val().val()-1);
537 ScalarType fpp = b.val().val()*(b.val().val()-1)*
pow(
a.val().val(),b.val().val()-2);
538 cc = FadFadType(this->n1,
FadType(this->n2,f));
539 for (
int i=0;
i<this->n2; ++
i)
540 cc.val().fastAccessDx(
i) = fp*
a.val().dx(
i);
541 for (
int i=0;
i<this->n1; ++
i) {
542 cc.fastAccessDx(
i) =
FadType(this->n2,fp*
a.dx(
i).val());
543 for (
int j=0; j<this->n2; ++j)
544 cc.fastAccessDx(
i).fastAccessDx(j) = fpp*
a.dx(
i).val()*
a.val().dx(j) + fp*
a.dx(
i).dx(j);
551 c =
pow(
a, b.val().val());
557 cc.val() =
FadType(this->n2,1.0);
558 for (
int i=0;
i<this->n1; ++
i)
559 cc.fastAccessDx(
i) = 0.0;
564 cc.val() =
FadType(this->n2,1.0);
565 for (
int i=0;
i<this->n1; ++
i)
566 cc.fastAccessDx(
i) = 0.0;
568 c =
pow(
a, b.val().val());
579 for (
int i=0;
i<this->n1; ++
i)
580 cc.fastAccessDx(
i) =
FadType(this->n2,0.0);
589 for (
int i=0;
i<this->n1; ++
i)
590 cc.fastAccessDx(
i) =
FadType(this->n2,0.0);
592 c =
pow(
a, b.val().val());
598 for (
int i=0;
i<this->n1; ++
i)
599 cc.fastAccessDx(
i) = 0.0;
606 c =
pow(
a, b.val().val());
614 f =
pow(
a.val().val(), b.val().val());
615 fp = b.val().val()*
pow(
a.val().val(),b.val().val()-1);
616 fpp = b.val().val()*(b.val().val()-1)*
pow(
a.val().val(),b.val().val()-2);
617 cc = FadFadType(this->n1,
FadType(this->n2,f));
618 for (
int i=0;
i<this->n2; ++
i)
619 cc.val().fastAccessDx(
i) = fp*
a.val().dx(
i);
620 for (
int i=0;
i<this->n1; ++
i) {
621 cc.fastAccessDx(
i) =
FadType(this->n2,fp*
a.dx(
i).val());
622 for (
int j=0; j<this->n2; ++j)
623 cc.fastAccessDx(
i).fastAccessDx(j) = fpp*
a.dx(
i).val()*
a.val().dx(j) + fp*
a.dx(
i).dx(j);
632 c =
pow(
a, b.val().val());
644 c =
pow(
a, b.val().val());
650 cc.val() =
FadType(this->n2, 1.0);
651 for (
int i=0;
i<this->n1; ++
i)
652 cc.fastAccessDx(
i) = 0.0;
658 c =
pow(
a, b.val().val());
675 testLessThanOrEquals,
676 testGreaterThanOrEquals,
710 #endif // NESETD_FADUNITTESTS_HPP FAD::Fad< FadType > a_fad_
ScalarT composite1(const ScalarT &a, const ScalarT &b)
#define COMPARE_NESTED_FADS(a, b)
FAD::Fad< FadType > b_fad_
Sacado::Fad::DFad< double > FadType
REGISTER_TYPED_TEST_SUITE_P(FadFadOpsUnitTest, testAddition, testSubtraction, testMultiplication, testDivision, testEquals, testNotEquals, testLessThanOrEquals, testGreaterThanOrEquals, testLessThan, testGreaterThan, testPow, testUnaryPlus, testUnaryMinus, testExp, testLog, testLog10, testSqrt, testCos, testSin, testTan, testACos, testASin, testATan, testCosh, testSinh, testTanh, testAbs, testFAbs, testPlusEquals, testMinusEquals, testTimesEquals, testDivideEquals, testMax, testMin, testComposite1, testPlusLR, testMinusLR, testTimesLR, testDivideLR, testPowConstB)
Sacado::ScalarType< FadFadType >::type ScalarType
#define BINARY_OP_TEST(FIXTURENAME, TESTNAME, OP)
#define UNARY_FUNC_TEST(FIXTURENAME, TESTNAME, FUNC)
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
TYPED_TEST_SUITE_P(FadFadOpsUnitTest)
FAD::Fad< FadType > c_fad_
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
#define UNARY_OP_TEST(FIXTURENAME, TESTNAME, OP)
TYPED_TEST_P(FadFadOpsUnitTest, testMax)
Sacado::ValueType< FadFadType >::type FadType
Sacado::Random< ScalarType > urand
SimpleFad< ValueT > max(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
SACADO_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)
#define BINARY_FUNC_TEST(FIXTURENAME, TESTNAME, FUNC)
A random number generator that generates random numbers uniformly distributed in the interval (a...
#define COMPARE_FADS(a, b)
ScalarT composite1_fad(const ScalarT &a, const ScalarT &b)
#define UNARY_ASSIGNOP_TEST(FIXTURENAME, TESTNAME, OP)
#define RELOP_TEST(FIXTURENAME, TESTNAME, OP)
Base template specification for testing whether type is statically sized.