GCC Code Coverage Report


Directory: ./
File: include/crocoddyl/core/residual-base.hxx
Date: 2025-05-13 10:30:51
Exec Total Coverage
Lines: 0 74 0.0%
Branches: 0 172 0.0%

Line Branch Exec Source
1 ///////////////////////////////////////////////////////////////////////////////
2 // BSD 3-Clause License
3 //
4 // Copyright (C) 2021-2025, University of Edinburgh, Heriot-Watt University
5 // Copyright note valid unless otherwise stated in individual files.
6 // All rights reserved.
7 ///////////////////////////////////////////////////////////////////////////////
8
9 namespace crocoddyl {
10
11 template <typename Scalar>
12 ResidualModelAbstractTpl<Scalar>::ResidualModelAbstractTpl(
13 std::shared_ptr<StateAbstract> state, const std::size_t nr,
14 const std::size_t nu, const bool q_dependent, const bool v_dependent,
15 const bool u_dependent)
16 : state_(state),
17 nr_(nr),
18 nu_(nu),
19 unone_(VectorXs::Zero(nu)),
20 q_dependent_(q_dependent),
21 v_dependent_(v_dependent),
22 u_dependent_(u_dependent) {}
23
24 template <typename Scalar>
25 ResidualModelAbstractTpl<Scalar>::ResidualModelAbstractTpl(
26 std::shared_ptr<StateAbstract> state, const std::size_t nr,
27 const bool q_dependent, const bool v_dependent, const bool u_dependent)
28 : state_(state),
29 nr_(nr),
30 nu_(state->get_nv()),
31 unone_(VectorXs::Zero(state->get_nv())),
32 q_dependent_(q_dependent),
33 v_dependent_(v_dependent),
34 u_dependent_(u_dependent) {}
35
36 template <typename Scalar>
37 void ResidualModelAbstractTpl<Scalar>::calc(
38 const std::shared_ptr<ResidualDataAbstract>&,
39 const Eigen::Ref<const VectorXs>&, const Eigen::Ref<const VectorXs>&) {}
40
41 template <typename Scalar>
42 void ResidualModelAbstractTpl<Scalar>::calc(
43 const std::shared_ptr<ResidualDataAbstract>& data,
44 const Eigen::Ref<const VectorXs>& x) {
45 calc(data, x, unone_);
46 }
47
48 template <typename Scalar>
49 void ResidualModelAbstractTpl<Scalar>::calcDiff(
50 const std::shared_ptr<ResidualDataAbstract>&,
51 const Eigen::Ref<const VectorXs>&, const Eigen::Ref<const VectorXs>&) {}
52
53 template <typename Scalar>
54 void ResidualModelAbstractTpl<Scalar>::calcDiff(
55 const std::shared_ptr<ResidualDataAbstract>& data,
56 const Eigen::Ref<const VectorXs>& x) {
57 calcDiff(data, x, unone_);
58 }
59
60 template <typename Scalar>
61 std::shared_ptr<ResidualDataAbstractTpl<Scalar> >
62 ResidualModelAbstractTpl<Scalar>::createData(
63 DataCollectorAbstract* const data) {
64 return std::allocate_shared<ResidualDataAbstract>(
65 Eigen::aligned_allocator<ResidualDataAbstract>(), this, data);
66 }
67
68 template <typename Scalar>
69 void ResidualModelAbstractTpl<Scalar>::calcCostDiff(
70 const std::shared_ptr<CostDataAbstract>& cdata,
71 const std::shared_ptr<ResidualDataAbstract>& rdata,
72 const std::shared_ptr<ActivationDataAbstract>& adata, const bool update_u) {
73 // This function computes the derivatives of the cost function based on a
74 // Gauss-Newton approximation
75 const bool is_ru = u_dependent_ && nu_ != 0 && update_u;
76 const std::size_t nv = state_->get_nv();
77 if (is_ru) {
78 cdata->Lu.noalias() = rdata->Ru.transpose() * adata->Ar;
79 rdata->Arr_Ru.noalias() = adata->Arr.diagonal().asDiagonal() * rdata->Ru;
80 cdata->Luu.noalias() = rdata->Ru.transpose() * rdata->Arr_Ru;
81 }
82 if (q_dependent_ && v_dependent_) {
83 cdata->Lx.noalias() = rdata->Rx.transpose() * adata->Ar;
84 rdata->Arr_Rx.noalias() = adata->Arr.diagonal().asDiagonal() * rdata->Rx;
85 cdata->Lxx.noalias() = rdata->Rx.transpose() * rdata->Arr_Rx;
86 if (is_ru) {
87 cdata->Lxu.noalias() = rdata->Rx.transpose() * rdata->Arr_Ru;
88 }
89 } else if (q_dependent_) {
90 Eigen::Block<MatrixXs, Eigen::Dynamic, Eigen::Dynamic, true> Rq =
91 rdata->Rx.leftCols(nv);
92 cdata->Lx.head(nv).noalias() = Rq.transpose() * adata->Ar;
93 rdata->Arr_Rx.leftCols(nv).noalias() =
94 adata->Arr.diagonal().asDiagonal() * Rq;
95 cdata->Lxx.topLeftCorner(nv, nv).noalias() =
96 Rq.transpose() * rdata->Arr_Rx.leftCols(nv);
97 if (is_ru) {
98 cdata->Lxu.topRows(nv).noalias() = Rq.transpose() * rdata->Arr_Ru;
99 }
100 } else if (v_dependent_) {
101 Eigen::Block<MatrixXs, Eigen::Dynamic, Eigen::Dynamic, true> Rv =
102 rdata->Rx.rightCols(nv);
103 cdata->Lx.tail(nv).noalias() = Rv.transpose() * adata->Ar;
104 rdata->Arr_Rx.rightCols(nv).noalias() =
105 adata->Arr.diagonal().asDiagonal() * Rv;
106 cdata->Lxx.bottomRightCorner(nv, nv).noalias() =
107 Rv.transpose() * rdata->Arr_Rx.rightCols(nv);
108 if (is_ru) {
109 cdata->Lxu.bottomRows(nv).noalias() = Rv.transpose() * rdata->Arr_Ru;
110 }
111 }
112 }
113
114 template <typename Scalar>
115 void ResidualModelAbstractTpl<Scalar>::print(std::ostream& os) const {
116 os << boost::core::demangle(typeid(*this).name());
117 }
118
119 template <typename Scalar>
120 const std::shared_ptr<StateAbstractTpl<Scalar> >&
121 ResidualModelAbstractTpl<Scalar>::get_state() const {
122 return state_;
123 }
124
125 template <typename Scalar>
126 std::size_t ResidualModelAbstractTpl<Scalar>::get_nr() const {
127 return nr_;
128 }
129
130 template <typename Scalar>
131 std::size_t ResidualModelAbstractTpl<Scalar>::get_nu() const {
132 return nu_;
133 }
134
135 template <typename Scalar>
136 bool ResidualModelAbstractTpl<Scalar>::get_q_dependent() const {
137 return q_dependent_;
138 }
139
140 template <typename Scalar>
141 bool ResidualModelAbstractTpl<Scalar>::get_v_dependent() const {
142 return v_dependent_;
143 }
144
145 template <typename Scalar>
146 bool ResidualModelAbstractTpl<Scalar>::get_u_dependent() const {
147 return u_dependent_;
148 }
149
150 template <typename Scalar>
151 std::ostream& operator<<(std::ostream& os,
152 const ResidualModelAbstractTpl<Scalar>& model) {
153 model.print(os);
154 return os;
155 }
156
157 } // namespace crocoddyl
158