66 d.kktMat(0, 0) = knot.
R;
67 d.kktMat(0, 1) = knot.
D.transpose();
68 d.kktMat(1, 0) = knot.
D;
69 d.kktMat(1, 1).diagonal().array() = -mueq;
71 VectorRef kff = d.ff[0] = -knot.
r;
72 VectorRef zff = d.ff[1] = -knot.
d;
73 RowMatrixRef K = d.fb.
blockRow(0) = -knot.
S.transpose();
74 RowMatrixRef Z = d.fb.
blockRow(1) = -knot.
C;
76 d.ldl.compute(d.kktMat.
matrix());
77 d.ldl.solveInPlace(d.ff.
matrix());
78 d.ldl.solveInPlace(d.fb.
matrix());
80 RowMatrixRef Kth = d.ft.
blockRow(0) = -knot.
Gu;
81 RowMatrixRef Zth = d.ft.
blockRow(1) = -knot.
Gv;
82 d.ldl.solveInPlace(d.ft.
matrix());
84 Eigen::Transpose Ct = knot.
C.transpose();
86 v.Pxx.noalias() = knot.
Q + knot.
S * K;
87 v.Pxx.noalias() += Ct * Z;
89 v.Pxt.noalias() = knot.
Gx + K.transpose() * knot.
Gu;
90 v.Pxt.noalias() += Z.transpose() * knot.
Gv;
92 v.Ptt.noalias() = knot.
Gth + knot.
Gu.transpose() * Kth;
93 v.Ptt.noalias() += knot.
Gv.transpose() * Zth;
95 v.px.noalias() = knot.
q + knot.
S * kff;
96 v.px.noalias() += Ct * zff;
98 v.pt.noalias() = knot.
gamma + knot.
Gu.transpose() * kff;
99 v.pt.noalias() += knot.
Gv.transpose() * zff;
103 const value *vn,
Scalar mudyn,
106 d.kktMat(0, 0) = knot.
R;
107 d.kktMat(1, 0) = knot.
D;
108 d.kktMat(0, 1) = knot.
D.transpose();
109 d.kktMat(1, 1).diagonal().setConstant(-mueq);
111 d.kktMat(2, 0) = knot.
B;
112 d.kktMat(0, 2) = knot.
B.transpose();
113 d.kktMat(2, 2).diagonal().setConstant(-mudyn);
114 d.kktMat(2, 3) = knot.
E;
115 d.kktMat(3, 2) = knot.
E.transpose();
117 d.kktMat(3, 3) = vn->Pxx;
120 d.ldl.compute(d.kktMat.
matrix());
124 VectorRef kff = d.ff[0] = -knot.
r;
125 VectorRef zff = d.ff[1] = -knot.
d;
126 VectorRef lff = d.ff[2] = -knot.
f;
127 VectorRef yff = d.ff[3];
132 RowMatrixRef K = d.fb.
blockRow(0) = -knot.
S.transpose();
133 RowMatrixRef Z = d.fb.
blockRow(1) = -knot.
C;
134 RowMatrixRef L = d.fb.
blockRow(2) = -knot.
A;
135 RowMatrixRef Y = d.fb.
blockRow(3).setZero();
138 RowMatrixRef Kth = d.ft.
blockRow(0) = -knot.
Gu;
139 RowMatrixRef Zth = d.ft.
blockRow(1) = -knot.
Gv;
141 RowMatrixRef Yth = d.ft.
blockRow(3);
145 d.ldl.solveInPlace(d.ff.
matrix());
146 d.ldl.solveInPlace(d.fb.
matrix());
147 d.ldl.solveInPlace(d.ft.
matrix());
150 Eigen::Transpose At = knot.
A.transpose();
151 Eigen::Transpose Ct = knot.
C.transpose();
153 v.Pxx.noalias() = knot.
Q + knot.
S * K;
154 v.Pxx.noalias() += Ct * Z;
155 v.Pxx.noalias() += At * L;
158 v.Pxt.noalias() += K.transpose() * knot.
Gu;
159 v.Pxt.noalias() += Z.transpose() * knot.
Gv;
161 v.Pxt.noalias() += Y.transpose() * vn->Pxt;
164 v.Ptt.noalias() += Kth.transpose() * knot.
Gu;
165 v.Ptt.noalias() += Zth.transpose() * knot.
Gv;
167 v.Ptt.noalias() += Yth.transpose() * vn->Pxt;
169 v.px.noalias() = knot.
q + knot.
S * kff;
170 v.px.noalias() += Ct * zff;
171 v.px.noalias() += At * lff;
173 v.pt.noalias() = knot.
gamma + knot.
Gu.transpose() * kff;
174 v.pt.noalias() += knot.
Gv.transpose() * zff;
176 v.pt.noalias() += vn->Pxt.transpose() * yff;
180 const Data &d, boost::span<VectorXs> xs,
181 boost::span<VectorXs> us, boost::span<VectorXs> vs,
182 boost::span<VectorXs> lbdas,
183 const std::optional<ConstVectorRef> &theta_) {
184 ConstVectorRef kff = d.ff[0];
185 ConstVectorRef zff = d.ff[1];
186 ConstVectorRef lff = d.ff[2];
187 ConstVectorRef yff = d.ff[3];
189 ConstRowMatrixRef K = d.fb.
blockRow(0);
190 ConstRowMatrixRef Z = d.fb.
blockRow(1);
191 ConstRowMatrixRef L = d.fb.
blockRow(2);
192 ConstRowMatrixRef Y = d.fb.
blockRow(3);
194 ConstRowMatrixRef Kth = d.ft.
blockRow(0);
195 ConstRowMatrixRef Zth = d.ft.
blockRow(1);
196 ConstRowMatrixRef Lth = d.ft.
blockRow(2);
197 ConstRowMatrixRef Yth = d.ft.
blockRow(3);
200 us[i].noalias() = kff + K * xs[i];
201 vs[i].noalias() = zff + Z * xs[i];
202 if (theta_.has_value()) {
204 us[i].noalias() += Kth * theta_.value();
205 vs[i].noalias() += Zth * theta_.value();
210 lbdas[i + 1].noalias() = lff + L * xs[i];
211 xs[i + 1].noalias() = yff + Y * xs[i];
212 if (theta_.has_value()) {
213 lbdas[i + 1].noalias() += Lth * theta_.value();
214 xs[i + 1].noalias() += Yth * theta_.value();