GCC Code Coverage Report


Directory: ./
File: unittest/eigenvalues.cpp
Date: 2025-02-12 21:03:38
Exec Total Coverage
Lines: 42 42 100.0%
Branches: 145 284 51.1%

Line Branch Exec Source
1 //
2 // Copyright (c) 2022 INRIA
3 //
4
5 #include <iostream>
6
7 #include <pinocchio/math/eigenvalues.hpp>
8
9 #include <boost/variant.hpp> // to avoid C99 warnings
10
11 #include <boost/test/unit_test.hpp>
12 #include <boost/utility/binary.hpp>
13
14 #include <Eigen/Eigenvalues>
15 #include <algorithm>
16
17 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
18
19 using namespace pinocchio;
20
21
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(test_identity)
22 {
23 2 const Eigen::DenseIndex mat_size = 20;
24
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 const Eigen::MatrixXd identity_mat = Eigen::MatrixXd::Identity(mat_size, mat_size);
25
26
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 auto eigen_vec = computeLargestEigenvector(identity_mat);
27
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 auto eigen_val = retrieveLargestEigenvalue(eigen_vec);
28
6/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
2 BOOST_CHECK(std::fabs(eigen_val - 1.) <= 1e-4);
29 2 }
30
31
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(test_random_matrix)
32 {
33 2 const Eigen::DenseIndex mat_size = 10;
34 2 const int num_tests = 1000;
35 2 const int num_it_max = 10;
36 2 const int num_it_max_finer = 100 * num_it_max;
37
38
2/2
✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 1 times.
2002 for (int k = 0; k < num_tests; ++k)
39 {
40
2/4
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
2000 const Eigen::MatrixXd A = Eigen::MatrixXd::Random(mat_size, mat_size);
41
3/6
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1000 times.
✗ Branch 8 not taken.
2000 const Eigen::MatrixXd sym_mat = (A * A.transpose());
42
43
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 const Eigen::EigenSolver<Eigen::MatrixXd> eigen_solver(sym_mat, true);
44
6/12
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 1000 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1000 times.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1000 times.
2000 BOOST_CHECK(eigen_solver.info() == Eigen::Success);
45
46 // Sort eigenvalues
47
2/4
✓ Branch 2 taken 1000 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
2000 Eigen::VectorXd sorted_eigen_values = eigen_solver.eigenvalues().real();
48
3/6
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1000 times.
✗ Branch 9 not taken.
2000 std::sort(sorted_eigen_values.data(), sorted_eigen_values.data() + sorted_eigen_values.size());
49
50
1/2
✓ Branch 2 taken 1000 times.
✗ Branch 3 not taken.
2000 const double eigen_val_ref = sorted_eigen_values[sorted_eigen_values.size() - 1];
51
52
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 auto eigen_vec = computeLargestEigenvector(sym_mat, num_it_max);
53
1/2
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
2000 auto eigen_val = retrieveLargestEigenvalue(eigen_vec);
54
55 bool test_relative_eigen_val =
56 2000 std::fabs(eigen_val - eigen_val_ref) / (std::max)(eigen_val, eigen_val_ref) <= 1e-2;
57
3/6
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1000 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1000 times.
✗ Branch 8 not taken.
2000 bool test_eigen_vec = (sym_mat * eigen_vec).isApprox(eigen_val * eigen_vec, 1e-2);
58
59
4/4
✓ Branch 0 taken 733 times.
✓ Branch 1 taken 267 times.
✓ Branch 2 taken 306 times.
✓ Branch 3 taken 427 times.
2000 if (!test_relative_eigen_val || !test_eigen_vec)
60 {
61
1/2
✓ Branch 1 taken 573 times.
✗ Branch 2 not taken.
1146 auto eigen_vec_finer = computeLargestEigenvector(sym_mat, num_it_max_finer);
62
1/2
✓ Branch 1 taken 573 times.
✗ Branch 2 not taken.
1146 auto eigen_val_finer = retrieveLargestEigenvalue(eigen_vec_finer);
63
64 1146 test_relative_eigen_val =
65 1146 std::fabs(eigen_val_finer - eigen_val_ref) / (std::max)(eigen_val_finer, eigen_val_ref)
66 <= 1e-2;
67 test_eigen_vec =
68
3/6
✓ Branch 1 taken 573 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 573 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 573 times.
✗ Branch 8 not taken.
1146 (sym_mat * eigen_vec_finer).isApprox(eigen_val_finer * eigen_vec_finer, 1e-2);
69
7/14
✓ Branch 1 taken 573 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 573 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 573 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 573 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 573 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 573 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 573 times.
✗ Branch 20 not taken.
1146 std::cout << "res: " << (sym_mat * eigen_vec - eigen_val * eigen_vec).norm() << std::endl;
70
3/6
✓ Branch 1 taken 573 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 573 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 573 times.
✗ Branch 8 not taken.
1146 std::cout << "eigen_val: " << eigen_val << std::endl;
71
3/6
✓ Branch 1 taken 573 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 573 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 573 times.
✗ Branch 8 not taken.
1146 std::cout << "eigen_val_finer: " << eigen_val_finer << std::endl;
72
3/6
✓ Branch 1 taken 573 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 573 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 573 times.
✗ Branch 8 not taken.
1146 std::cout << "eigen_val_ref: " << eigen_val_ref << std::endl;
73
1/2
✓ Branch 1 taken 573 times.
✗ Branch 2 not taken.
1146 std::cout << "res finer: "
74
5/10
✓ Branch 1 taken 573 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 573 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 573 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 573 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 573 times.
✗ Branch 14 not taken.
1146 << (sym_mat * eigen_vec_finer - eigen_val_finer * eigen_vec_finer).norm()
75
1/2
✓ Branch 1 taken 573 times.
✗ Branch 2 not taken.
1146 << std::endl;
76 1146 }
77
6/12
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1000 times.
2000 BOOST_CHECK(test_relative_eigen_val);
78
6/12
✓ Branch 1 taken 1000 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1000 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 1000 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1000 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1000 times.
✗ Branch 18 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1000 times.
2000 BOOST_CHECK(test_eigen_vec);
79 2000 }
80 2 }
81
82 BOOST_AUTO_TEST_SUITE_END()
83