33 #include "gtest/gtest.h"
82 void incX1(
int idx,
double inc) {
x1[idx] += inc; }
83 void fun1(Eigen::VectorXd& values)
85 values[0] =
x1[0] + 2 *
x1[1] + 3 *
x1[2];
86 values[1] = 4 *
x1[1];
87 values[2] = 5 *
x1[1] + 6 *
x1[2];
97 void incX2(
int idx,
double inc) {
x2[idx] += inc; }
98 void fun2(Eigen::VectorXd& values) { values[0] =
x2[0] *
x2[0] +
x2[1] *
x2[1] *
x2[1] +
x2[0] *
x2[0] *
x2[1]; }
108 void incX3(
int idx,
double inc) {
x3[idx] += inc; }
109 void fun3(Eigen::VectorXd& values)
111 values[0] =
x3[0] *
x3[0] + 2 *
x3[1] *
x3[1] + 3 *
x3[2] *
x3[2];
112 values[1] =
x3[0] *
x3[1] + 2 *
x3[0] *
x3[2];
122 auto linc1 = [
this](
int idx,
double inc) { incX1(idx, inc); };
123 auto lfun1 = [
this](Eigen::VectorXd& values) { fun1(values); };
128 auto linc2 = [
this](
int idx,
double inc) { incX2(idx, inc); };
129 auto lfun2 = [
this](Eigen::VectorXd& values) { fun2(values); };
134 auto linc3 = [
this](
int idx,
double inc) { incX3(idx, inc); };
135 auto lfun3 = [
this](Eigen::VectorXd& values) { fun3(values); };
144 auto linc1 = [
this](
int idx,
double inc) { incX1(idx, inc); };
145 auto lfun1 = [
this](Eigen::VectorXd& values) { fun1(values); };
150 auto linc2 = [
this](
int idx,
double inc) { incX2(idx, inc); };
151 auto lfun2 = [
this](Eigen::VectorXd& values) { fun2(values); };
156 auto linc3 = [
this](
int idx,
double inc) { incX3(idx, inc); };
157 auto lfun3 = [
this](Eigen::VectorXd& values) { fun3(values); };
166 auto linc1 = [
this](
int idx,
double inc) { incX1(idx, inc); };
167 auto lfun1 = [
this](Eigen::VectorXd& values) { fun1(values); };
172 auto linc2 = [
this](
int idx,
double inc) { incX2(idx, inc); };
173 auto lfun2 = [
this](Eigen::VectorXd& values) { fun2(values); };
178 auto linc3 = [
this](
int idx,
double inc) { incX3(idx, inc); };
179 auto lfun3 = [
this](Eigen::VectorXd& values) { fun3(values); };
188 auto linc1 = [
this](
int idx,
double inc) { incX1(idx, inc); };
189 auto lfun1 = [
this](Eigen::VectorXd& values) { fun1(values); };
194 auto linc2 = [
this](
int idx,
double inc) { incX2(idx, inc); };
195 auto lfun2 = [
this](Eigen::VectorXd& values) { fun2(values); };
200 auto linc3 = [
this](
int idx,
double inc) { incX3(idx, inc); };
201 auto lfun3 = [
this](Eigen::VectorXd& values) { fun3(values); };
210 auto linc1 = [
this](
int idx,
double inc) { incX1(idx, inc); };
211 auto lfun1 = [
this](Eigen::VectorXd& values) { fun1(values); };
216 auto linc2 = [
this](
int idx,
double inc) { incX2(idx, inc); };
217 auto lfun2 = [
this](Eigen::VectorXd& values) { fun2(values); };
222 auto linc3 = [
this](
int idx,
double inc) { incX3(idx, inc); };
223 auto lfun3 = [
this](Eigen::VectorXd& values) { fun3(values); };
225 EXPECT_EQ_MATRIX(hessian3, multipliers3[0] * hessian3_sol_a + multipliers3[1] * hessian3_sol_b, 1e-5);
232 auto linc1 = [
this](
int idx,
double inc) { incX1(idx, inc); };
233 auto lfun1 = [
this](Eigen::VectorXd& values) { fun1(values); };
238 auto linc2 = [
this](
int idx,
double inc) { incX2(idx, inc); };
239 auto lfun2 = [
this](Eigen::VectorXd& values) { fun2(values); };
244 auto linc3 = [
this](
int idx,
double inc) { incX3(idx, inc); };
245 auto lfun3 = [
this](Eigen::VectorXd& values) { fun3(values); };
247 EXPECT_EQ_MATRIX(hessian3, multipliers3[0] * hessian3_sol_a + multipliers3[1] * hessian3_sol_b, 1e-5);
254 auto linc1 = [
this](
int idx,
double inc) { incX1(idx, inc); };
255 auto lfun1 = [
this](Eigen::VectorXd& values) { fun1(values); };
261 auto linc2 = [
this](
int idx,
double inc) { incX2(idx, inc); };
262 auto lfun2 = [
this](Eigen::VectorXd& values) { fun2(values); };
268 auto linc3 = [
this](
int idx,
double inc) { incX3(idx, inc); };
269 auto lfun3 = [
this](Eigen::VectorXd& values) { fun3(values); };
279 auto linc1 = [
this](
int idx,
double inc) { incX1(idx, inc); };
280 auto lfun1 = [
this](Eigen::VectorXd& values) { fun1(values); };
286 auto linc2 = [
this](
int idx,
double inc) { incX2(idx, inc); };
287 auto lfun2 = [
this](Eigen::VectorXd& values) { fun2(values); };
293 auto linc3 = [
this](
int idx,
double inc) { incX3(idx, inc); };
294 auto lfun3 = [
this](Eigen::VectorXd& values) { fun3(values); };
304 auto linc1 = [
this](
int idx,
double inc) { incX1(idx, inc); };
305 auto lfun1 = [
this](Eigen::VectorXd& values) { fun1(values); };
307 Eigen::MatrixXd jacob1_scaled_sol = jacobian1_sol.array().colwise() * multipliers1_vec.array();
312 auto linc2 = [
this](
int idx,
double inc) { incX2(idx, inc); };
313 auto lfun2 = [
this](Eigen::VectorXd& values) { fun2(values); };
315 Eigen::MatrixXd jacob2_scaled_sol = jacobian2_sol.array().colwise() * multipliers2_vec.array();
320 auto linc3 = [
this](
int idx,
double inc) { incX3(idx, inc); };
321 auto lfun3 = [
this](Eigen::VectorXd& values) { fun3(values); };
323 Eigen::MatrixXd jacob3_scaled_sol = jacobian3_sol.array().colwise() * multipliers3_vec.array();
325 EXPECT_EQ_MATRIX(hessian3, multipliers3[0] * hessian3_sol_a + multipliers3[1] * hessian3_sol_b, 1e-5);
332 auto linc1 = [
this](
int idx,
double inc) { incX1(idx, inc); };
333 auto lfun1 = [
this](Eigen::VectorXd& values) { fun1(values); };
335 Eigen::MatrixXd jacob1_scaled_sol = jacobian1_sol.array().colwise() * multipliers1_vec.array();
340 auto linc2 = [
this](
int idx,
double inc) { incX2(idx, inc); };
341 auto lfun2 = [
this](Eigen::VectorXd& values) { fun2(values); };
343 Eigen::MatrixXd jacob2_scaled_sol = jacobian2_sol.array().colwise() * multipliers2_vec.array();
348 auto linc3 = [
this](
int idx,
double inc) { incX3(idx, inc); };
349 auto lfun3 = [
this](Eigen::VectorXd& values) { fun3(values); };
351 Eigen::MatrixXd jacob3_scaled_sol = jacobian3_sol.array().colwise() * multipliers3_vec.array();
353 EXPECT_EQ_MATRIX(hessian3, multipliers3[0] * hessian3_sol_a + multipliers3[1] * hessian3_sol_b, 1e-5);