aboutsummaryrefslogtreecommitdiffhomepage
path: root/unsupported/test/autodiff_scalar.cpp
diff options
context:
space:
mode:
authorGravatar Geoffrey Lalonde <lalondegeoffrey@gmail.com>2016-06-15 23:33:19 -0700
committerGravatar Geoffrey Lalonde <lalondegeoffrey@gmail.com>2016-06-15 23:33:19 -0700
commit72c95383e03ea86d6a154faa7ec684d7f4d1e750 (patch)
treecbd943554a09ec50c34e496ec1241f0ffe16b540 /unsupported/test/autodiff_scalar.cpp
parentd7e3e4bb0407718d27cb62c6409dfaf0ea0986d1 (diff)
Add autodiff coverage for standard library hyperbolic functions, and tests.
* * * Corrected tanh derivatived, moved test definitions. * * * Added more test cases, removed lingering lines
Diffstat (limited to 'unsupported/test/autodiff_scalar.cpp')
-rw-r--r--unsupported/test/autodiff_scalar.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/unsupported/test/autodiff_scalar.cpp b/unsupported/test/autodiff_scalar.cpp
index c631c734a..4df2f5c57 100644
--- a/unsupported/test/autodiff_scalar.cpp
+++ b/unsupported/test/autodiff_scalar.cpp
@@ -36,13 +36,48 @@ template<typename Scalar> void check_atan2()
VERIFY_IS_APPROX(res.derivatives(), x.derivatives());
}
+template<typename Scalar> void check_hyperbolic_functions()
+{
+ using std::sinh;
+ using std::cosh;
+ using std::tanh;
+ typedef Matrix<Scalar, 1, 1> Deriv1;
+ typedef AutoDiffScalar<Deriv1> AD;
+ Deriv1 p = Deriv1::Random();
+ AD val(p.x(),Deriv1::UnitX());
+
+ Scalar cosh_px = std::cosh(p.x());
+ AD res1 = tanh(val);
+ VERIFY_IS_APPROX(res1.value(), std::tanh(p.x()));
+ VERIFY_IS_APPROX(res1.derivatives().x(), Scalar(1.0) / (cosh_px * cosh_px));
+ AD res2 = sinh(val);
+ VERIFY_IS_APPROX(res2.value(), std::sinh(p.x()));
+ VERIFY_IS_APPROX(res2.derivatives().x(), cosh_px);
+ AD res3 = cosh(val);
+ VERIFY_IS_APPROX(res3.value(), cosh_px);
+ VERIFY_IS_APPROX(res3.derivatives().x(), std::sinh(p.x()));
+
+ // Check constant values.
+ const Scalar sample_point = Scalar(1) / Scalar(3);
+ val = AD(sample_point,Deriv1::UnitX());
+ res1 = tanh(val);
+ VERIFY_IS_APPROX(res1.derivatives().x(), Scalar(0.896629559604914));
+
+ res2 = sinh(val);
+ VERIFY_IS_APPROX(res2.derivatives().x(), Scalar(1.056071867829939));
+
+ res3 = cosh(val);
+ VERIFY_IS_APPROX(res3.derivatives().x(), Scalar(0.339540557256150));
+}
void test_autodiff_scalar()
{
for(int i = 0; i < g_repeat; i++) {
CALL_SUBTEST_1( check_atan2<float>() );
CALL_SUBTEST_2( check_atan2<double>() );
+ CALL_SUBTEST_3( check_hyperbolic_functions<float>() );
+ CALL_SUBTEST_4( check_hyperbolic_functions<double>() );
}
}