//===-- test_funcs.cpp - test duals/dual ------------------------*- C++ -*-===// // // Part of the cppduals project. // https://gitlab.com/tesch1/cppduals // // See https://gitlab.com/tesch1/cppduals/blob/master/LICENSE.txt for // license information. // // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // // (c)2019 Michael Tesch. tesch1@gmail.com // /** * \file test_eigen Dual number Eigen integration tests * * (c)2019 Michael Tesch. tesch1@gmail.com */ #include "type_name.hpp" #include #include #include #include #include #include #include "eexpokit/padm.hpp" #include "gtest/gtest.h" using duals::rpart; using duals::dpart; using duals::dualf; using duals::duald; using duals::dualld; using duals::hyperdualf; using duals::hyperduald; using duals::hyperdualld; using duals::is_dual; using duals::is_complex; using duals::dual_traits; using namespace duals::literals; typedef std::complex complexd; typedef std::complex complexf; typedef std::complex cduald; typedef std::complex cdualf; template using emtx = Eigen::Matrix; template using smtx = Eigen::SparseMatrix; template using ecf = Eigen::Matrix ; template using edf = Eigen::Matrix ; template using ecdf = Eigen::Matrix ; #define _EXPECT_TRUE(...) {typedef __VA_ARGS__ tru; EXPECT_TRUE(tru::value); static_assert(tru::value, "sa"); } #define _EXPECT_FALSE(...) {typedef __VA_ARGS__ fal; EXPECT_FALSE(fal::value); static_assert(!fal::value, "sa"); } #define EXPECT_DEQ(A,B) EXPECT_EQ(rpart(A), rpart(B)); EXPECT_EQ(dpart(A), dpart(B)) #define ASSERT_DEQ(A,B) ASSERT_EQ(rpart(A), rpart(B)); ASSERT_EQ(dpart(A), dpart(B)) #define EXPECT_DNE(A,B) EXPECT_NE(rpart(A), rpart(B)); EXPECT_NE(dpart(A), dpart(B)) #define EXPECT_DNEAR(A,B,tol) \ EXPECT_NEAR(rpart(A), rpart(B),tol); \ EXPECT_NEAR(dpart(A), dpart(B),tol) template > void solveLu() { auto tol = NN * NN * 10000 * Eigen::NumTraits::epsilon(); // check scalar emtx a = emtx::Random(); emtx b = emtx::Random(); emtx c,d,e; c = a * b; d = a.lu().solve(c); EXPECT_LT((b - d).norm(), tol); // check dual emtx A = a + DT(0,1) * emtx::Random(); emtx B = b + DT(0,1) * emtx::Random(); emtx C,D,E; C = A * B; D = A.lu().solve(C); EXPECT_LT(rpart(B - D).norm(), tol); EXPECT_LT(dpart(B - D).norm(), tol); } #if defined(PHASE_1) TEST(solveLu, float2) { solveLu(); } TEST(solveLu, float7) { solveLu(); } TEST(solveLu, float8) { solveLu(); } TEST(solveLu, float31) { solveLu(); } TEST(solveLu, double2) { solveLu(); } TEST(solveLu, double3) { solveLu(); } TEST(solveLu, double4) { solveLu(); } TEST(solveLu, double31) { solveLu(); } #elif defined(PHASE_2) TEST(solveLu, complexf2) { solveLu(); } TEST(solveLu, complexf8) { solveLu(); } TEST(solveLu, complexf31) { solveLu(); } TEST(solveLu, complexd31) { solveLu(); } #endif #define QUOTE(...) STRFY(__VA_ARGS__) #define STRFY(...) #__VA_ARGS__ int main(int argc, char **argv) { std::cout << "OPT_FLAGS=" << QUOTE(OPT_FLAGS) << "\n"; std::cout << "INSTRUCTIONSET=" << Eigen::SimdInstructionSetsInUse() << "\n"; ::testing::InitGoogleTest(&argc, argv); std::cout.precision(20); std::cerr.precision(20); return RUN_ALL_TESTS(); }