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>
124 ScalarT t1 = 3. * a +
sin(b) /
log(
fabs(a - b * 7.));
130 t1 /=
cosh(b - 0.7) + 7.*
sinh(t1 + 0.8)*
tanh(9./a) - 9.;
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); \
272 RELOP_TEST(FadFadOpsUnitTest, testNotEquals, !=)
273 RELOP_TEST(FadFadOpsUnitTest, testLessThanOrEquals, <=)
274 RELOP_TEST(FadFadOpsUnitTest, testGreaterThanOrEquals, >=)
275 RELOP_TEST(FadFadOpsUnitTest, testLessThan, <)
276 RELOP_TEST(FadFadOpsUnitTest, testGreaterThan, >)
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_
REGISTER_TYPED_TEST_SUITE_P(FadBLASUnitTests, testSCAL1, testSCAL2, testSCAL3, testSCAL4, testCOPY1, testCOPY2, testCOPY3, testCOPY4, testAXPY1, testAXPY2, testAXPY3, testAXPY4, testDOT1, testDOT2, testDOT3, testDOT4, testNRM21, testNRM22, testGEMV1, testGEMV2, testGEMV3, testGEMV4, testGEMV5, testGEMV6, testGEMV7, testGEMV8, testGEMV9, testTRMV1, testTRMV2, testTRMV3, testTRMV4, testGER1, testGER2, testGER3, testGER4, testGER5, testGER6, testGER7, testGEMM1, testGEMM2, testGEMM3, testGEMM4, testGEMM5, testGEMM6, testGEMM7, testGEMM8, testGEMM9, testGEMM10, testSYMM1, testSYMM2, testSYMM3, testSYMM4, testSYMM5, testSYMM6, testSYMM7, testSYMM8, testSYMM9, testTRMM1, testTRMM2, testTRMM3, testTRMM4, testTRMM5, testTRMM6, testTRMM7, testTRSM1, testTRSM2, testTRSM3, testTRSM4, testTRSM5, testTRSM6, testTRSM7)
ScalarT composite1(const ScalarT &a, const ScalarT &b)
TYPED_TEST_P(FadBLASUnitTests, testSCAL1)
#define COMPARE_NESTED_FADS(a, b)
FAD::Fad< FadType > b_fad_
Sacado::Fad::DFad< double > FadType
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
FAD::Fad< FadType > c_fad_
SimpleFad< ValueT > min(const SimpleFad< ValueT > &a, const SimpleFad< ValueT > &b)
#define UNARY_OP_TEST(FIXTURENAME, TESTNAME, OP)
Sacado::ValueType< FadFadType >::type FadType
TYPED_TEST_SUITE_P(FadBLASUnitTests)
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.