Directory: | ./ |
---|---|
File: | include/crocoddyl/core/integrator/rk.hxx |
Date: | 2025-03-26 19:23:43 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 265 | 285 | 93.0% |
Branches: | 321 | 792 | 40.5% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /////////////////////////////////////////////////////////////////////////////// | ||
2 | // BSD 3-Clause License | ||
3 | // | ||
4 | // Copyright (C) 2019-2025, University of Edinburgh, University of Trento, | ||
5 | // LAAS-CNRS, IRI: CSIC-UPC, Heriot-Watt University | ||
6 | // Copyright note valid unless otherwise stated in individual files. | ||
7 | // All rights reserved. | ||
8 | /////////////////////////////////////////////////////////////////////////////// | ||
9 | |||
10 | #include <iostream> | ||
11 | |||
12 | namespace crocoddyl { | ||
13 | |||
14 | template <typename Scalar> | ||
15 | 552 | IntegratedActionModelRKTpl<Scalar>::IntegratedActionModelRKTpl( | |
16 | std::shared_ptr<DifferentialActionModelAbstract> model, | ||
17 | std::shared_ptr<ControlParametrizationModelAbstract> control, | ||
18 | const RKType rktype, const Scalar time_step, const bool with_cost_residual) | ||
19 |
1/2✓ Branch 3 taken 552 times.
✗ Branch 4 not taken.
|
552 | : Base(model, control, time_step, with_cost_residual), rk_type_(rktype) { |
20 |
1/2✓ Branch 1 taken 552 times.
✗ Branch 2 not taken.
|
552 | set_rk_type(rktype); |
21 | 552 | } | |
22 | |||
23 | template <typename Scalar> | ||
24 | 280 | IntegratedActionModelRKTpl<Scalar>::IntegratedActionModelRKTpl( | |
25 | std::shared_ptr<DifferentialActionModelAbstract> model, const RKType rktype, | ||
26 | const Scalar time_step, const bool with_cost_residual) | ||
27 |
1/2✓ Branch 2 taken 280 times.
✗ Branch 3 not taken.
|
280 | : Base(model, time_step, with_cost_residual), rk_type_(rktype) { |
28 |
1/2✓ Branch 1 taken 280 times.
✗ Branch 2 not taken.
|
280 | set_rk_type(rktype); |
29 | 280 | } | |
30 | |||
31 | template <typename Scalar> | ||
32 | 25224 | void IntegratedActionModelRKTpl<Scalar>::calc( | |
33 | const std::shared_ptr<ActionDataAbstract>& data, | ||
34 | const Eigen::Ref<const VectorXs>& x, const Eigen::Ref<const VectorXs>& u) { | ||
35 |
1/2✗ Branch 3 not taken.
✓ Branch 4 taken 25224 times.
|
25224 | if (static_cast<std::size_t>(x.size()) != state_->get_nx()) { |
36 | ✗ | throw_pretty( | |
37 | "Invalid argument: " << "x has wrong dimension (it should be " + | ||
38 | std::to_string(state_->get_nx()) + ")"); | ||
39 | } | ||
40 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 25224 times.
|
25224 | if (static_cast<std::size_t>(u.size()) != nu_) { |
41 | ✗ | throw_pretty( | |
42 | "Invalid argument: " << "u has wrong dimension (it should be " + | ||
43 | std::to_string(nu_) + ")"); | ||
44 | } | ||
45 | 25224 | const std::size_t nv = state_->get_nv(); | |
46 | 25224 | Data* d = static_cast<Data*>(data.get()); | |
47 | |||
48 | const std::shared_ptr<DifferentialActionDataAbstract>& k0_data = | ||
49 | 25224 | d->differential[0]; | |
50 | const std::shared_ptr<ControlParametrizationDataAbstract>& u0_data = | ||
51 | 25224 | d->control[0]; | |
52 | 25224 | control_->calc(u0_data, rk_c_[0], u); | |
53 | 25224 | d->ws[0] = u0_data->w; | |
54 |
1/2✓ Branch 4 taken 25224 times.
✗ Branch 5 not taken.
|
25224 | differential_->calc(k0_data, x, d->ws[0]); |
55 | 25224 | d->y[0] = x; | |
56 |
2/4✓ Branch 4 taken 25224 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 25224 times.
✗ Branch 8 not taken.
|
25224 | d->ki[0].head(nv) = d->y[0].tail(nv); |
57 |
1/2✓ Branch 4 taken 25224 times.
✗ Branch 5 not taken.
|
25224 | d->ki[0].tail(nv) = k0_data->xout; |
58 | 25224 | d->integral[0] = k0_data->cost; | |
59 |
2/2✓ Branch 0 taken 52737 times.
✓ Branch 1 taken 25224 times.
|
77961 | for (std::size_t i = 1; i < ni_; ++i) { |
60 | const std::shared_ptr<DifferentialActionDataAbstract>& ki_data = | ||
61 | 52737 | d->differential[i]; | |
62 | const std::shared_ptr<ControlParametrizationDataAbstract>& ui_data = | ||
63 | 52737 | d->control[i]; | |
64 |
3/6✓ Branch 3 taken 52737 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 52737 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 52737 times.
✗ Branch 11 not taken.
|
52737 | d->dx_rk[i].noalias() = time_step_ * rk_c_[i] * d->ki[i - 1]; |
65 |
2/4✓ Branch 5 taken 52737 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 52737 times.
✗ Branch 9 not taken.
|
52737 | state_->integrate(x, d->dx_rk[i], d->y[i]); |
66 | 52737 | control_->calc(ui_data, rk_c_[i], u); | |
67 | 52737 | d->ws[i] = ui_data->w; | |
68 |
2/4✓ Branch 5 taken 52737 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 52737 times.
✗ Branch 9 not taken.
|
52737 | differential_->calc(ki_data, d->y[i], d->ws[i]); |
69 |
2/4✓ Branch 4 taken 52737 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 52737 times.
✗ Branch 8 not taken.
|
52737 | d->ki[i].head(nv) = d->y[i].tail(nv); |
70 |
1/2✓ Branch 4 taken 52737 times.
✗ Branch 5 not taken.
|
52737 | d->ki[i].tail(nv) = ki_data->xout; |
71 | 52737 | d->integral[i] = ki_data->cost; | |
72 | } | ||
73 | |||
74 |
2/2✓ Branch 0 taken 6884 times.
✓ Branch 1 taken 18340 times.
|
25224 | if (ni_ == 2) { |
75 |
1/2✓ Branch 3 taken 6884 times.
✗ Branch 4 not taken.
|
6884 | d->dx = d->ki[1] * time_step_; |
76 | 6884 | d->cost = d->integral[1] * time_step_; | |
77 |
2/2✓ Branch 0 taken 9167 times.
✓ Branch 1 taken 9173 times.
|
18340 | } else if (ni_ == 3) { |
78 |
5/10✓ Branch 2 taken 9167 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 9167 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 9167 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 9167 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 9167 times.
✗ Branch 16 not taken.
|
9167 | d->dx = (d->ki[0] + Scalar(3.) * d->ki[2]) * time_step_ / Scalar(4.); |
79 | 9167 | d->cost = (d->integral[0] + Scalar(3.) * d->integral[2]) * time_step_ / | |
80 | Scalar(4.); | ||
81 | } else { | ||
82 |
6/12✓ Branch 1 taken 9173 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9173 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9173 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9173 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 9173 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 9173 times.
✗ Branch 17 not taken.
|
9173 | d->dx = |
83 |
2/4✓ Branch 2 taken 9173 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 9173 times.
✗ Branch 7 not taken.
|
9173 | (d->ki[0] + Scalar(2.) * d->ki[1] + Scalar(2.) * d->ki[2] + d->ki[3]) * |
84 | 9173 | time_step_ / Scalar(6.); | |
85 | 9173 | d->cost = (d->integral[0] + Scalar(2.) * d->integral[1] + | |
86 | 9173 | Scalar(2.) * d->integral[2] + d->integral[3]) * | |
87 | 9173 | time_step_ / Scalar(6.); | |
88 | } | ||
89 |
2/4✓ Branch 3 taken 25224 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 25224 times.
✗ Branch 7 not taken.
|
25224 | state_->integrate(x, d->dx, d->xnext); |
90 | 25224 | d->g = k0_data->g; | |
91 | 25224 | d->h = k0_data->h; | |
92 |
1/2✓ Branch 0 taken 25224 times.
✗ Branch 1 not taken.
|
25224 | if (with_cost_residual_) { |
93 | 25224 | d->r = k0_data->r; | |
94 | } | ||
95 | 25224 | } | |
96 | |||
97 | template <typename Scalar> | ||
98 | 7857 | void IntegratedActionModelRKTpl<Scalar>::calc( | |
99 | const std::shared_ptr<ActionDataAbstract>& data, | ||
100 | const Eigen::Ref<const VectorXs>& x) { | ||
101 |
1/2✗ Branch 3 not taken.
✓ Branch 4 taken 7857 times.
|
7857 | if (static_cast<std::size_t>(x.size()) != state_->get_nx()) { |
102 | ✗ | throw_pretty( | |
103 | "Invalid argument: " << "x has wrong dimension (it should be " + | ||
104 | std::to_string(state_->get_nx()) + ")"); | ||
105 | } | ||
106 | 7857 | Data* d = static_cast<Data*>(data.get()); | |
107 | |||
108 | const std::shared_ptr<DifferentialActionDataAbstract>& k0_data = | ||
109 | 7857 | d->differential[0]; | |
110 | 7857 | differential_->calc(k0_data, x); | |
111 | 7857 | d->dx.setZero(); | |
112 | 7857 | d->xnext = x; | |
113 | 7857 | d->cost = k0_data->cost; | |
114 | 7857 | d->g = k0_data->g; | |
115 | 7857 | d->h = k0_data->h; | |
116 |
1/2✓ Branch 0 taken 7857 times.
✗ Branch 1 not taken.
|
7857 | if (with_cost_residual_) { |
117 | 7857 | d->r = k0_data->r; | |
118 | } | ||
119 | 7857 | } | |
120 | |||
121 | template <typename Scalar> | ||
122 | 4327 | void IntegratedActionModelRKTpl<Scalar>::calcDiff( | |
123 | const std::shared_ptr<ActionDataAbstract>& data, | ||
124 | const Eigen::Ref<const VectorXs>& x, const Eigen::Ref<const VectorXs>& u) { | ||
125 |
1/2✗ Branch 3 not taken.
✓ Branch 4 taken 4327 times.
|
4327 | if (static_cast<std::size_t>(x.size()) != state_->get_nx()) { |
126 | ✗ | throw_pretty( | |
127 | "Invalid argument: " << "x has wrong dimension (it should be " + | ||
128 | std::to_string(state_->get_nx()) + ")"); | ||
129 | } | ||
130 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 4327 times.
|
4327 | if (static_cast<std::size_t>(u.size()) != nu_) { |
131 | ✗ | throw_pretty( | |
132 | "Invalid argument: " << "u has wrong dimension (it should be " + | ||
133 | std::to_string(nu_) + ")"); | ||
134 | } | ||
135 | 4327 | const std::size_t nv = state_->get_nv(); | |
136 | 4327 | const std::size_t nu = control_->get_nu(); | |
137 | 4327 | Data* d = static_cast<Data*>(data.get()); | |
138 |
5/18✓ Branch 5 taken 4327 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 4327 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 4327 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 4327 times.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 4327 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
|
4327 | assert_pretty( |
139 | MatrixXs(d->dyi_dx[0]) | ||
140 | .isApprox(MatrixXs::Identity(state_->get_ndx(), state_->get_ndx())), | ||
141 | "you have changed dyi_dx[0] values that supposed to be constant."); | ||
142 |
4/16✓ Branch 3 taken 4327 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 4327 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4327 times.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 4327 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
4327 | assert_pretty( |
143 | MatrixXs(d->dki_dx[0]) | ||
144 | .topRightCorner(nv, nv) | ||
145 | .isApprox(MatrixXs::Identity(nv, nv)), | ||
146 | "you have changed dki_dx[0] values that supposed to be constant."); | ||
147 | |||
148 |
2/2✓ Branch 0 taken 13007 times.
✓ Branch 1 taken 4327 times.
|
17334 | for (std::size_t i = 0; i < ni_; ++i) { |
149 |
2/4✓ Branch 5 taken 13007 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 13007 times.
✗ Branch 10 not taken.
|
13007 | differential_->calcDiff(d->differential[i], d->y[i], d->ws[i]); |
150 | } | ||
151 | |||
152 | const std::shared_ptr<DifferentialActionDataAbstract>& k0_data = | ||
153 | 4327 | d->differential[0]; | |
154 | const std::shared_ptr<ControlParametrizationDataAbstract>& u0_data = | ||
155 | 4327 | d->control[0]; | |
156 |
1/2✓ Branch 4 taken 4327 times.
✗ Branch 5 not taken.
|
4327 | d->dki_dx[0].bottomRows(nv) = k0_data->Fx; |
157 |
2/4✓ Branch 2 taken 4327 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4327 times.
✗ Branch 6 not taken.
|
12981 | control_->multiplyByJacobian( |
158 |
1/2✓ Branch 2 taken 4327 times.
✗ Branch 3 not taken.
|
4327 | u0_data, k0_data->Fu, |
159 | 4327 | d->dki_du[0].bottomRows(nv)); // dki_du = dki_dw * dw_du | |
160 | |||
161 | 4327 | d->dli_dx[0] = k0_data->Lx; | |
162 |
1/2✓ Branch 3 taken 4327 times.
✗ Branch 4 not taken.
|
12981 | control_->multiplyJacobianTransposeBy( |
163 |
1/2✓ Branch 2 taken 4327 times.
✗ Branch 3 not taken.
|
4327 | u0_data, k0_data->Lu, |
164 | 4327 | d->dli_du[0]); // dli_du = dli_dw * dw_du | |
165 | |||
166 | 4327 | d->ddli_ddx[0] = k0_data->Lxx; | |
167 | 4327 | d->ddli_ddw[0] = k0_data->Luu; | |
168 |
2/4✓ Branch 3 taken 4327 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 4327 times.
✗ Branch 7 not taken.
|
12981 | control_->multiplyByJacobian( |
169 | 4327 | u0_data, d->ddli_ddw[0], | |
170 | 4327 | d->ddli_dwdu[0]); // ddli_dwdu = ddli_ddw * dw_du | |
171 |
2/4✓ Branch 3 taken 4327 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 4327 times.
✗ Branch 7 not taken.
|
12981 | control_->multiplyJacobianTransposeBy( |
172 | 4327 | u0_data, d->ddli_dwdu[0], | |
173 | 4327 | d->ddli_ddu[0]); // ddli_ddu = dw_du.T * ddli_dwdu | |
174 | 4327 | d->ddli_dxdw[0] = k0_data->Lxu; | |
175 |
2/4✓ Branch 3 taken 4327 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 4327 times.
✗ Branch 7 not taken.
|
12981 | control_->multiplyByJacobian( |
176 | 4327 | u0_data, d->ddli_dxdw[0], | |
177 | 4327 | d->ddli_dxdu[0]); // ddli_dxdu = ddli_dxdw * dw_du | |
178 | |||
179 |
2/2✓ Branch 0 taken 8680 times.
✓ Branch 1 taken 4327 times.
|
13007 | for (std::size_t i = 1; i < ni_; ++i) { |
180 | const std::shared_ptr<DifferentialActionDataAbstract>& ki_data = | ||
181 | 8680 | d->differential[i]; | |
182 | const std::shared_ptr<ControlParametrizationDataAbstract>& ui_data = | ||
183 | 8680 | d->control[i]; | |
184 |
4/8✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8680 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 8680 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 8680 times.
✗ Branch 14 not taken.
|
8680 | d->dyi_dx[i].noalias() = d->dki_dx[i - 1] * rk_c_[i] * time_step_; |
185 |
4/8✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8680 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 8680 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 8680 times.
✗ Branch 14 not taken.
|
8680 | d->dyi_du[i].noalias() = d->dki_du[i - 1] * rk_c_[i] * time_step_; |
186 |
3/6✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 8680 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8680 times.
✗ Branch 11 not taken.
|
8680 | state_->JintegrateTransport(x, d->dx_rk[i], d->dyi_dx[i], second); |
187 |
4/8✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 8680 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 8680 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 8680 times.
✗ Branch 15 not taken.
|
8680 | state_->Jintegrate(x, d->dx_rk[i], d->dyi_dx[i], d->dyi_dx[i], first, |
188 | addto); | ||
189 |
3/6✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 8680 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8680 times.
✗ Branch 11 not taken.
|
8680 | state_->JintegrateTransport(x, d->dx_rk[i], d->dyi_du[i], |
190 | second); // dyi_du = Jintegrate * dyi_du | ||
191 | |||
192 | // Sparse matrix-matrix multiplication for computing: | ||
193 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | Eigen::Block<MatrixXs> dkvi_dq = d->dki_dx[i].bottomLeftCorner(nv, nv); |
194 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | Eigen::Block<MatrixXs> dkvi_dv = d->dki_dx[i].bottomRightCorner(nv, nv); |
195 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | Eigen::Block<MatrixXs> dkqi_du = d->dki_du[i].topLeftCorner(nv, nu); |
196 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | Eigen::Block<MatrixXs> dkvi_du = d->dki_du[i].bottomLeftCorner(nv, nu); |
197 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | const Eigen::Block<MatrixXs> dki_dqi = ki_data->Fx.bottomLeftCorner(nv, nv); |
198 | const Eigen::Block<MatrixXs> dki_dvi = | ||
199 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | ki_data->Fx.bottomRightCorner(nv, nv); |
200 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | const Eigen::Block<MatrixXs> dqi_dq = d->dyi_dx[i].topLeftCorner(nv, nv); |
201 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | const Eigen::Block<MatrixXs> dqi_dv = d->dyi_dx[i].topRightCorner(nv, nv); |
202 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | const Eigen::Block<MatrixXs> dvi_dq = d->dyi_dx[i].bottomLeftCorner(nv, nv); |
203 | const Eigen::Block<MatrixXs> dvi_dv = | ||
204 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | d->dyi_dx[i].bottomRightCorner(nv, nv); |
205 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | const Eigen::Block<MatrixXs> dqi_du = d->dyi_du[i].topLeftCorner(nv, nu); |
206 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | const Eigen::Block<MatrixXs> dvi_du = d->dyi_du[i].bottomLeftCorner(nv, nu); |
207 | // i. d->dki_dx[i].noalias() = d->dki_dy[i] * d->dyi_dx[i], where dki_dy | ||
208 | // is ki_data.Fx | ||
209 |
3/6✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 8680 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 8680 times.
✗ Branch 10 not taken.
|
8680 | d->dki_dx[i].topRows(nv) = d->dyi_dx[i].bottomRows(nv); |
210 |
3/6✓ Branch 1 taken 8680 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8680 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8680 times.
✗ Branch 8 not taken.
|
8680 | dkvi_dq.noalias() = dki_dqi * dqi_dq; |
211 |
2/2✓ Branch 0 taken 4327 times.
✓ Branch 1 taken 4353 times.
|
8680 | if (i == 1) { |
212 |
2/4✓ Branch 1 taken 4327 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4327 times.
✗ Branch 5 not taken.
|
4327 | dkvi_dv = time_step_ / Scalar(2.) * dki_dqi; |
213 | } else { | ||
214 |
3/6✓ Branch 1 taken 4353 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4353 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4353 times.
✗ Branch 8 not taken.
|
4353 | dkvi_dv.noalias() = dki_dqi * dqi_dv; |
215 | } | ||
216 |
3/6✓ Branch 1 taken 8680 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8680 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8680 times.
✗ Branch 8 not taken.
|
8680 | dkvi_dq.noalias() += dki_dvi * dvi_dq; |
217 |
3/6✓ Branch 1 taken 8680 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8680 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8680 times.
✗ Branch 8 not taken.
|
8680 | dkvi_dv.noalias() += dki_dvi * dvi_dv; |
218 | // ii. d->dki_du[i].noalias() = d->dki_dy[i] * d->dyi_du[i], where dki_dy | ||
219 | // is ki_data.Fx | ||
220 |
1/2✓ Branch 1 taken 8680 times.
✗ Branch 2 not taken.
|
8680 | dkqi_du = dvi_du; |
221 |
3/6✓ Branch 1 taken 8680 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8680 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8680 times.
✗ Branch 8 not taken.
|
8680 | dkvi_du.noalias() = dki_dqi * dqi_du; |
222 |
3/6✓ Branch 1 taken 8680 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8680 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8680 times.
✗ Branch 8 not taken.
|
8680 | dkvi_du.noalias() += dki_dvi * dvi_du; |
223 | |||
224 |
3/6✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 8680 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 8680 times.
✗ Branch 10 not taken.
|
17360 | control_->multiplyByJacobian(ui_data, ki_data->Fu, |
225 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | d->dki_du[i].bottomRows(nv), |
226 | addto); // dfi_du = dki_dw * dw_du | ||
227 | |||
228 |
4/8✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8680 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 8680 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 8680 times.
✗ Branch 14 not taken.
|
8680 | d->dli_dx[i].noalias() = ki_data->Lx.transpose() * d->dyi_dx[i]; |
229 |
3/6✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 8680 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 8680 times.
✗ Branch 10 not taken.
|
17360 | control_->multiplyJacobianTransposeBy(ui_data, ki_data->Lu, |
230 | 8680 | d->dli_du[i]); // dli_du = Lu * dw_du | |
231 |
4/8✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8680 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 8680 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 8680 times.
✗ Branch 14 not taken.
|
8680 | d->dli_du[i].noalias() += ki_data->Lx.transpose() * d->dyi_du[i]; |
232 | |||
233 |
3/6✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 8680 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8680 times.
✗ Branch 11 not taken.
|
8680 | d->Lxx_partialx[i].noalias() = ki_data->Lxx * d->dyi_dx[i]; |
234 |
4/8✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8680 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 8680 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 8680 times.
✗ Branch 14 not taken.
|
8680 | d->ddli_ddx[i].noalias() = d->dyi_dx[i].transpose() * d->Lxx_partialx[i]; |
235 | |||
236 |
3/6✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 8680 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 8680 times.
✗ Branch 10 not taken.
|
17360 | control_->multiplyByJacobian(ui_data, ki_data->Lxu, |
237 | 8680 | d->Lxu_i[i]); // Lxu = Lxw * dw_du | |
238 |
4/8✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8680 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 8680 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 8680 times.
✗ Branch 14 not taken.
|
8680 | d->Luu_partialx[i].noalias() = d->Lxu_i[i].transpose() * d->dyi_du[i]; |
239 |
3/6✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 8680 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8680 times.
✗ Branch 11 not taken.
|
8680 | d->Lxx_partialu[i].noalias() = ki_data->Lxx * d->dyi_du[i]; |
240 |
2/4✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 8680 times.
✗ Branch 6 not taken.
|
26040 | control_->multiplyByJacobian( |
241 |
1/2✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
|
8680 | ui_data, ki_data->Luu, |
242 | 8680 | d->ddli_dwdu[i]); // ddli_dwdu = ddli_ddw * dw_du | |
243 |
3/6✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 8680 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 8680 times.
✗ Branch 9 not taken.
|
26040 | control_->multiplyJacobianTransposeBy( |
244 | 8680 | ui_data, d->ddli_dwdu[i], | |
245 | 8680 | d->ddli_ddu[i]); // ddli_ddu = dw_du.T * ddli_dwdu | |
246 |
5/10✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 8680 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 8680 times.
✗ Branch 9 not taken.
✓ Branch 12 taken 8680 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 8680 times.
✗ Branch 16 not taken.
|
8680 | d->ddli_ddu[i].noalias() += d->Luu_partialx[i].transpose() + |
247 | 8680 | d->Luu_partialx[i] + | |
248 |
2/4✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8680 times.
✗ Branch 7 not taken.
|
8680 | d->dyi_du[i].transpose() * d->Lxx_partialu[i]; |
249 | |||
250 |
4/8✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8680 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 8680 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 8680 times.
✗ Branch 14 not taken.
|
8680 | d->ddli_dxdw[i].noalias() = d->dyi_dx[i].transpose() * ki_data->Lxu; |
251 |
3/6✓ Branch 2 taken 8680 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 8680 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 8680 times.
✗ Branch 9 not taken.
|
26040 | control_->multiplyByJacobian( |
252 | 8680 | ui_data, d->ddli_dxdw[i], | |
253 | 8680 | d->ddli_dxdu[i]); // ddli_dxdu = ddli_dxdw * dw_du | |
254 |
4/8✓ Branch 3 taken 8680 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8680 times.
✗ Branch 7 not taken.
✓ Branch 10 taken 8680 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 8680 times.
✗ Branch 14 not taken.
|
8680 | d->ddli_dxdu[i].noalias() += d->dyi_dx[i].transpose() * d->Lxx_partialu[i]; |
255 | } | ||
256 | |||
257 |
2/2✓ Branch 0 taken 1426 times.
✓ Branch 1 taken 2901 times.
|
4327 | if (ni_ == 2) { |
258 |
2/4✓ Branch 3 taken 1426 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1426 times.
✗ Branch 7 not taken.
|
1426 | d->Fx.noalias() = time_step_ * d->dki_dx[1]; |
259 |
2/4✓ Branch 3 taken 1426 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1426 times.
✗ Branch 7 not taken.
|
1426 | d->Fu.noalias() = time_step_ * d->dki_du[1]; |
260 |
2/4✓ Branch 3 taken 1426 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1426 times.
✗ Branch 7 not taken.
|
1426 | d->Lx.noalias() = time_step_ * d->dli_dx[1]; |
261 |
2/4✓ Branch 3 taken 1426 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1426 times.
✗ Branch 7 not taken.
|
1426 | d->Lu.noalias() = time_step_ * d->dli_du[1]; |
262 |
2/4✓ Branch 3 taken 1426 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1426 times.
✗ Branch 7 not taken.
|
1426 | d->Lxx.noalias() = time_step_ * d->ddli_ddx[1]; |
263 |
2/4✓ Branch 3 taken 1426 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1426 times.
✗ Branch 7 not taken.
|
1426 | d->Luu.noalias() = time_step_ * d->ddli_ddu[1]; |
264 |
2/4✓ Branch 3 taken 1426 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1426 times.
✗ Branch 7 not taken.
|
1426 | d->Lxu.noalias() = time_step_ * d->ddli_dxdu[1]; |
265 |
2/2✓ Branch 0 taken 1449 times.
✓ Branch 1 taken 1452 times.
|
2901 | } else if (ni_ == 3) { |
266 |
3/6✓ Branch 1 taken 1449 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1449 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1449 times.
✗ Branch 8 not taken.
|
2898 | d->Fx.noalias() = |
267 |
2/4✓ Branch 2 taken 1449 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1449 times.
✗ Branch 7 not taken.
|
2898 | time_step_ / Scalar(4.) * (d->dki_dx[0] + Scalar(3.) * d->dki_dx[2]); |
268 |
3/6✓ Branch 1 taken 1449 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1449 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1449 times.
✗ Branch 8 not taken.
|
2898 | d->Fu.noalias() = |
269 |
2/4✓ Branch 2 taken 1449 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1449 times.
✗ Branch 7 not taken.
|
2898 | time_step_ / Scalar(4.) * (d->dki_du[0] + Scalar(3.) * d->dki_du[2]); |
270 |
3/6✓ Branch 1 taken 1449 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1449 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1449 times.
✗ Branch 8 not taken.
|
2898 | d->Lx.noalias() = |
271 |
2/4✓ Branch 2 taken 1449 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1449 times.
✗ Branch 7 not taken.
|
2898 | time_step_ / Scalar(4.) * (d->dli_dx[0] + Scalar(3.) * d->dli_dx[2]); |
272 |
3/6✓ Branch 1 taken 1449 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1449 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1449 times.
✗ Branch 8 not taken.
|
2898 | d->Lu.noalias() = |
273 |
2/4✓ Branch 2 taken 1449 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1449 times.
✗ Branch 7 not taken.
|
2898 | time_step_ / Scalar(4.) * (d->dli_du[0] + Scalar(3.) * d->dli_du[2]); |
274 |
4/8✓ Branch 1 taken 1449 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1449 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1449 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1449 times.
✗ Branch 11 not taken.
|
1449 | d->Lxx.noalias() = time_step_ / Scalar(4.) * |
275 |
1/2✓ Branch 2 taken 1449 times.
✗ Branch 3 not taken.
|
1449 | (d->ddli_ddx[0] + Scalar(3.) * d->ddli_ddx[2]); |
276 |
4/8✓ Branch 1 taken 1449 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1449 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1449 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1449 times.
✗ Branch 11 not taken.
|
1449 | d->Luu.noalias() = time_step_ / Scalar(4.) * |
277 |
1/2✓ Branch 2 taken 1449 times.
✗ Branch 3 not taken.
|
1449 | (d->ddli_ddu[0] + Scalar(3.) * d->ddli_ddu[2]); |
278 |
4/8✓ Branch 1 taken 1449 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1449 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1449 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1449 times.
✗ Branch 11 not taken.
|
1449 | d->Lxu.noalias() = time_step_ / Scalar(4.) * |
279 |
1/2✓ Branch 2 taken 1449 times.
✗ Branch 3 not taken.
|
2898 | (d->ddli_dxdu[0] + Scalar(3.) * d->ddli_dxdu[2]); |
280 | } else { | ||
281 |
6/12✓ Branch 1 taken 1452 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1452 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1452 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1452 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1452 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1452 times.
✗ Branch 17 not taken.
|
1452 | d->Fx.noalias() = time_step_ / Scalar(6.) * |
282 |
1/2✓ Branch 2 taken 1452 times.
✗ Branch 3 not taken.
|
1452 | (d->dki_dx[0] + Scalar(2.) * d->dki_dx[1] + |
283 |
1/2✓ Branch 3 taken 1452 times.
✗ Branch 4 not taken.
|
1452 | Scalar(2.) * d->dki_dx[2] + d->dki_dx[3]); |
284 |
6/12✓ Branch 1 taken 1452 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1452 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1452 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1452 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1452 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1452 times.
✗ Branch 17 not taken.
|
1452 | d->Fu.noalias() = time_step_ / Scalar(6.) * |
285 |
1/2✓ Branch 2 taken 1452 times.
✗ Branch 3 not taken.
|
1452 | (d->dki_du[0] + Scalar(2.) * d->dki_du[1] + |
286 |
1/2✓ Branch 3 taken 1452 times.
✗ Branch 4 not taken.
|
1452 | Scalar(2.) * d->dki_du[2] + d->dki_du[3]); |
287 |
6/12✓ Branch 1 taken 1452 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1452 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1452 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1452 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1452 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1452 times.
✗ Branch 17 not taken.
|
1452 | d->Lx.noalias() = time_step_ / Scalar(6.) * |
288 |
1/2✓ Branch 2 taken 1452 times.
✗ Branch 3 not taken.
|
1452 | (d->dli_dx[0] + Scalar(2.) * d->dli_dx[1] + |
289 |
1/2✓ Branch 3 taken 1452 times.
✗ Branch 4 not taken.
|
1452 | Scalar(2.) * d->dli_dx[2] + d->dli_dx[3]); |
290 |
6/12✓ Branch 1 taken 1452 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1452 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1452 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1452 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1452 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1452 times.
✗ Branch 17 not taken.
|
1452 | d->Lu.noalias() = time_step_ / Scalar(6.) * |
291 |
1/2✓ Branch 2 taken 1452 times.
✗ Branch 3 not taken.
|
1452 | (d->dli_du[0] + Scalar(2.) * d->dli_du[1] + |
292 |
1/2✓ Branch 3 taken 1452 times.
✗ Branch 4 not taken.
|
1452 | Scalar(2.) * d->dli_du[2] + d->dli_du[3]); |
293 |
6/12✓ Branch 1 taken 1452 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1452 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1452 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1452 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1452 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1452 times.
✗ Branch 17 not taken.
|
1452 | d->Lxx.noalias() = time_step_ / Scalar(6.) * |
294 |
1/2✓ Branch 2 taken 1452 times.
✗ Branch 3 not taken.
|
1452 | (d->ddli_ddx[0] + Scalar(2.) * d->ddli_ddx[1] + |
295 |
1/2✓ Branch 3 taken 1452 times.
✗ Branch 4 not taken.
|
1452 | Scalar(2.) * d->ddli_ddx[2] + d->ddli_ddx[3]); |
296 |
6/12✓ Branch 1 taken 1452 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1452 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1452 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1452 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1452 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1452 times.
✗ Branch 17 not taken.
|
1452 | d->Luu.noalias() = time_step_ / Scalar(6.) * |
297 |
1/2✓ Branch 2 taken 1452 times.
✗ Branch 3 not taken.
|
1452 | (d->ddli_ddu[0] + Scalar(2.) * d->ddli_ddu[1] + |
298 |
1/2✓ Branch 3 taken 1452 times.
✗ Branch 4 not taken.
|
1452 | Scalar(2.) * d->ddli_ddu[2] + d->ddli_ddu[3]); |
299 |
6/12✓ Branch 1 taken 1452 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1452 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1452 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1452 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1452 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1452 times.
✗ Branch 17 not taken.
|
1452 | d->Lxu.noalias() = time_step_ / Scalar(6.) * |
300 |
1/2✓ Branch 2 taken 1452 times.
✗ Branch 3 not taken.
|
1452 | (d->ddli_dxdu[0] + Scalar(2.) * d->ddli_dxdu[1] + |
301 |
1/2✓ Branch 3 taken 1452 times.
✗ Branch 4 not taken.
|
2904 | Scalar(2.) * d->ddli_dxdu[2] + d->ddli_dxdu[3]); |
302 | } | ||
303 | 4327 | d->Gx = k0_data->Gx; | |
304 | 4327 | d->Hx = k0_data->Hx; | |
305 | 4327 | d->Gu.conservativeResize(differential_->get_ng(), nu_); | |
306 | 4327 | d->Hu.conservativeResize(differential_->get_nh(), nu_); | |
307 |
2/4✓ Branch 4 taken 4327 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4327 times.
✗ Branch 8 not taken.
|
4327 | control_->multiplyByJacobian(u0_data, k0_data->Gu, d->Gu); |
308 |
2/4✓ Branch 4 taken 4327 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4327 times.
✗ Branch 8 not taken.
|
4327 | control_->multiplyByJacobian(u0_data, k0_data->Hu, d->Hu); |
309 | |||
310 |
2/4✓ Branch 3 taken 4327 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 4327 times.
✗ Branch 7 not taken.
|
4327 | state_->JintegrateTransport(x, d->dx, d->Fx, second); |
311 |
3/6✓ Branch 3 taken 4327 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 4327 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 4327 times.
✗ Branch 10 not taken.
|
4327 | state_->Jintegrate(x, d->dx, d->Fx, d->Fx, first, addto); |
312 |
2/4✓ Branch 3 taken 4327 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 4327 times.
✗ Branch 7 not taken.
|
4327 | state_->JintegrateTransport(x, d->dx, d->Fu, second); |
313 | 4327 | } | |
314 | |||
315 | template <typename Scalar> | ||
316 | 394 | void IntegratedActionModelRKTpl<Scalar>::calcDiff( | |
317 | const std::shared_ptr<ActionDataAbstract>& data, | ||
318 | const Eigen::Ref<const VectorXs>& x) { | ||
319 |
1/2✗ Branch 3 not taken.
✓ Branch 4 taken 394 times.
|
394 | if (static_cast<std::size_t>(x.size()) != state_->get_nx()) { |
320 | ✗ | throw_pretty( | |
321 | "Invalid argument: " << "x has wrong dimension (it should be " + | ||
322 | std::to_string(state_->get_nx()) + ")"); | ||
323 | } | ||
324 | 394 | Data* d = static_cast<Data*>(data.get()); | |
325 | |||
326 | const std::shared_ptr<DifferentialActionDataAbstract>& k0_data = | ||
327 | 394 | d->differential[0]; | |
328 | 394 | differential_->calcDiff(k0_data, x); | |
329 | 394 | d->Lx = k0_data->Lx; | |
330 | 394 | d->Lxx = k0_data->Lxx; | |
331 | 394 | d->Gx = k0_data->Gx; | |
332 | 394 | d->Hx = k0_data->Hx; | |
333 | 394 | } | |
334 | |||
335 | template <typename Scalar> | ||
336 | std::shared_ptr<ActionDataAbstractTpl<Scalar> > | ||
337 | 31557 | IntegratedActionModelRKTpl<Scalar>::createData() { | |
338 |
1/2✓ Branch 2 taken 31557 times.
✗ Branch 3 not taken.
|
31557 | return std::allocate_shared<Data>(Eigen::aligned_allocator<Data>(), this); |
339 | } | ||
340 | |||
341 | template <typename Scalar> | ||
342 | template <typename NewScalar> | ||
343 | ✗ | IntegratedActionModelRKTpl<NewScalar> IntegratedActionModelRKTpl<Scalar>::cast() | |
344 | const { | ||
345 | typedef IntegratedActionModelRKTpl<NewScalar> ReturnType; | ||
346 | ✗ | if (control_) { | |
347 | ✗ | ReturnType ret(differential_->template cast<NewScalar>(), | |
348 | ✗ | control_->template cast<NewScalar>(), rk_type_, | |
349 | ✗ | scalar_cast<NewScalar>(time_step_), with_cost_residual_); | |
350 | ✗ | return ret; | |
351 | ✗ | } else { | |
352 | ✗ | ReturnType ret(differential_->template cast<NewScalar>(), rk_type_, | |
353 | ✗ | scalar_cast<NewScalar>(time_step_), with_cost_residual_); | |
354 | ✗ | return ret; | |
355 | } | ||
356 | } | ||
357 | |||
358 | template <typename Scalar> | ||
359 | 4531 | bool IntegratedActionModelRKTpl<Scalar>::checkData( | |
360 | const std::shared_ptr<ActionDataAbstract>& data) { | ||
361 | 4531 | std::shared_ptr<Data> d = std::dynamic_pointer_cast<Data>(data); | |
362 |
1/2✓ Branch 1 taken 4531 times.
✗ Branch 2 not taken.
|
4531 | if (data != NULL) { |
363 |
2/2✓ Branch 0 taken 13616 times.
✓ Branch 1 taken 4531 times.
|
18147 | for (std::size_t i = 0; i < ni_; ++i) { |
364 |
2/4✓ Branch 4 taken 13616 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 13616 times.
|
13616 | if (!differential_->checkData(d->differential[i])) { |
365 | ✗ | return false; | |
366 | } | ||
367 | } | ||
368 | 4531 | return true; | |
369 | } else { | ||
370 | ✗ | return false; | |
371 | } | ||
372 | 4531 | } | |
373 | |||
374 | template <typename Scalar> | ||
375 | 5520 | void IntegratedActionModelRKTpl<Scalar>::quasiStatic( | |
376 | const std::shared_ptr<ActionDataAbstract>& data, Eigen::Ref<VectorXs> u, | ||
377 | const Eigen::Ref<const VectorXs>& x, const std::size_t maxiter, | ||
378 | const Scalar tol) { | ||
379 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 5520 times.
|
5520 | if (static_cast<std::size_t>(u.size()) != nu_) { |
380 | ✗ | throw_pretty( | |
381 | "Invalid argument: " << "u has wrong dimension (it should be " + | ||
382 | std::to_string(nu_) + ")"); | ||
383 | } | ||
384 |
1/2✗ Branch 3 not taken.
✓ Branch 4 taken 5520 times.
|
5520 | if (static_cast<std::size_t>(x.size()) != state_->get_nx()) { |
385 | ✗ | throw_pretty( | |
386 | "Invalid argument: " << "x has wrong dimension (it should be " + | ||
387 | std::to_string(state_->get_nx()) + ")"); | ||
388 | } | ||
389 | |||
390 | 5520 | Data* d = static_cast<Data*>(data.get()); | |
391 | const std::shared_ptr<ControlParametrizationDataAbstract>& u0_data = | ||
392 | 5520 | d->control[0]; | |
393 |
1/2✓ Branch 2 taken 5520 times.
✗ Branch 3 not taken.
|
5520 | u0_data->w *= Scalar(0.); |
394 |
1/2✓ Branch 5 taken 5520 times.
✗ Branch 6 not taken.
|
5520 | differential_->quasiStatic(d->differential[0], u0_data->w, x, maxiter, tol); |
395 |
1/2✓ Branch 4 taken 5520 times.
✗ Branch 5 not taken.
|
5520 | control_->params(u0_data, Scalar(0.), u0_data->w); |
396 | 5520 | u = u0_data->u; | |
397 | 5520 | } | |
398 | |||
399 | template <typename Scalar> | ||
400 | 791241 | std::size_t IntegratedActionModelRKTpl<Scalar>::get_ni() const { | |
401 | 791241 | return ni_; | |
402 | } | ||
403 | |||
404 | template <typename Scalar> | ||
405 | 184 | void IntegratedActionModelRKTpl<Scalar>::print(std::ostream& os) const { | |
406 | 184 | os << "IntegratedActionModelRK {dt=" << time_step_ << ", " << *differential_ | |
407 | 184 | << "}"; | |
408 | 184 | } | |
409 | |||
410 | template <typename Scalar> | ||
411 | 832 | void IntegratedActionModelRKTpl<Scalar>::set_rk_type(const RKType rktype) { | |
412 |
3/4✓ Branch 0 taken 231 times.
✓ Branch 1 taken 299 times.
✓ Branch 2 taken 302 times.
✗ Branch 3 not taken.
|
832 | switch (rktype) { |
413 | 231 | case two: | |
414 | 231 | ni_ = 2; | |
415 | 231 | rk_c_.resize(ni_); | |
416 | 231 | rk_c_[0] = Scalar(0.); | |
417 | 231 | rk_c_[1] = Scalar(0.5); | |
418 | 231 | break; | |
419 | 299 | case three: | |
420 | 299 | ni_ = 3; | |
421 | 299 | rk_c_.resize(ni_); | |
422 | 299 | rk_c_[0] = Scalar(0.); | |
423 | 299 | rk_c_[1] = Scalar(1. / 3.); | |
424 | 299 | rk_c_[2] = Scalar(2. / 3.); | |
425 | 299 | break; | |
426 | 302 | case four: | |
427 | 302 | ni_ = 4; | |
428 | 302 | rk_c_.resize(ni_); | |
429 | 302 | rk_c_[0] = Scalar(0.); | |
430 | 302 | rk_c_[1] = Scalar(0.5); | |
431 | 302 | rk_c_[2] = Scalar(0.5); | |
432 | 302 | rk_c_[3] = Scalar(1.); | |
433 | 302 | break; | |
434 | } | ||
435 | 832 | } | |
436 | |||
437 | } // namespace crocoddyl | ||
438 |