GCC Code Coverage Report


Directory: ./
File: include/pinocchio/algorithm/delassus-operator-dense.hpp
Date: 2024-08-27 18:20:05
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