GCC Code Coverage Report


Directory: ./
File: include/pinocchio/algorithm/delassus-operator-dense.hpp
Date: 2025-02-12 21:03:38
Exec Total Coverage
Lines: 0 42 0.0%
Branches: 0 86 0.0%

Line Branch Exec Source
1 //
2 // Copyright (c) 2024 INRIA
3 //
4
5 #ifndef __pinocchio_algorithm_delassus_operator_dense_hpp__
6 #define __pinocchio_algorithm_delassus_operator_dense_hpp__
7
8 #include "pinocchio/algorithm/fwd.hpp"
9 #include "pinocchio/algorithm/delassus-operator-base.hpp"
10
11 namespace pinocchio
12 {
13
14 template<typename _Scalar, int _Options>
15 struct traits<DelassusOperatorDenseTpl<_Scalar, _Options>>
16 {
17 typedef _Scalar Scalar;
18 enum
19 {
20 Options = _Options,
21 RowsAtCompileTime = Eigen::Dynamic
22 };
23
24 typedef Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic, Options> Matrix;
25 typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1, Options> Vector;
26 };
27
28 template<typename _Scalar, int _Options>
29 struct DelassusOperatorDenseTpl
30 : DelassusOperatorBase<DelassusOperatorDenseTpl<_Scalar, _Options>>
31 {
32 typedef _Scalar Scalar;
33 typedef DelassusOperatorDenseTpl Self;
34 enum
35 {
36 Options = _Options,
37 RowsAtCompileTime = traits<DelassusOperatorDenseTpl>::RowsAtCompileTime
38 };
39
40 typedef typename traits<Self>::Matrix Matrix;
41 typedef typename traits<Self>::Vector Vector;
42 typedef Eigen::LLT<Matrix> CholeskyDecomposition;
43 typedef DelassusOperatorBase<Self> Base;
44
45 template<typename MatrixDerived>
46 ✗ explicit DelassusOperatorDenseTpl(const Eigen::MatrixBase<MatrixDerived> & mat)
47 : Base(mat.rows())
48 ✗ , delassus_matrix(mat)
49 ✗ , mat_tmp(mat.rows(), mat.cols())
50 ✗ , llt(mat)
51 ✗ , damping(Vector::Zero(mat.rows()))
52 {
53 ✗ PINOCCHIO_CHECK_ARGUMENT_SIZE(mat.rows(), mat.cols());
54 }
55
56 template<typename VectorLike>
57 ✗ void updateDamping(const Eigen::MatrixBase<VectorLike> & vec)
58 {
59 ✗ damping = vec;
60 ✗ mat_tmp = delassus_matrix;
61 ✗ mat_tmp += vec.asDiagonal();
62 ✗ llt.compute(mat_tmp);
63 }
64
65 ✗ void updateDamping(const Scalar & mu)
66 {
67 ✗ updateDamping(Vector::Constant(size(), mu));
68 }
69
70 template<typename MatrixLike>
71 ✗ void solveInPlace(const Eigen::MatrixBase<MatrixLike> & mat) const
72 {
73 ✗ llt.solveInPlace(mat.const_cast_derived());
74 }
75
76 template<typename MatrixLike>
77 typename PINOCCHIO_EIGEN_PLAIN_TYPE(MatrixLike)
78 ✗ solve(const Eigen::MatrixBase<MatrixLike> & mat) const
79 {
80 ✗ typename PINOCCHIO_EIGEN_PLAIN_TYPE(MatrixLike) res(mat);
81 ✗ solveInPlace(res);
82 ✗ return res;
83 }
84
85 template<typename MatrixDerivedIn, typename MatrixDerivedOut>
86 void solve(
87 const Eigen::MatrixBase<MatrixDerivedIn> & x,
88 const Eigen::MatrixBase<MatrixDerivedOut> & res) const
89 {
90 res.const_cast_derived() = x;
91 solveInPlace(res.const_cast_derived());
92 }
93
94 template<typename MatrixIn, typename MatrixOut>
95 ✗ void applyOnTheRight(
96 const Eigen::MatrixBase<MatrixIn> & x, const Eigen::MatrixBase<MatrixOut> & res_) const
97 {
98 ✗ MatrixOut & res = res_.const_cast_derived();
99 ✗ res.noalias() = delassus_matrix * x;
100 ✗ res.array() += damping.array() * x.array();
101 }
102
103 template<typename MatrixDerived>
104 typename PINOCCHIO_EIGEN_PLAIN_TYPE(MatrixDerived)
105 ✗ operator*(const Eigen::MatrixBase<MatrixDerived> & x) const
106 {
107 typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(MatrixDerived) ReturnType;
108
109 ✗ PINOCCHIO_CHECK_ARGUMENT_SIZE(x.rows(), size());
110 ✗ ReturnType res(x.rows(), x.cols());
111 ✗ applyOnTheRight(x, res);
112 ✗ return res;
113 }
114
115 ✗ Eigen::DenseIndex size() const
116 {
117 ✗ return delassus_matrix.rows();
118 }
119 ✗ Eigen::DenseIndex rows() const
120 {
121 ✗ return delassus_matrix.rows();
122 }
123 ✗ Eigen::DenseIndex cols() const
124 {
125 ✗ return delassus_matrix.cols();
126 }
127
128 ✗ Matrix matrix() const
129 {
130 ✗ mat_tmp = delassus_matrix;
131 ✗ mat_tmp += damping.asDiagonal();
132 ✗ return mat_tmp;
133 }
134
135 ✗ Matrix inverse() const
136 {
137 ✗ Matrix res = Matrix::Identity(size(), size());
138 ✗ llt.solveInPlace(res);
139 ✗ return res;
140 }
141
142 protected:
143 Matrix delassus_matrix;
144 mutable Matrix mat_tmp;
145 CholeskyDecomposition llt;
146 Vector damping;
147
148 }; // struct DelassusOperatorDenseTpl
149
150 } // namespace pinocchio
151
152 #endif // ifndef __pinocchio_algorithm_delassus_operator_dense_hpp__
153