33 #include "gtest/gtest.h" 64 hessian2_sol << 2 + 2 * x2[1], 2 * x2[0], 2 * x2[0], 6 * x2[1];
70 jacobian3_sol << 2 *
x3[0], 4 * x3[1], 6 * x3[2], x3[1] + 2 * x3[2], x3[0], 2 * x3[0];
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); };
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); };
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); };
312 auto linc2 = [
this](
int idx,
double inc) {
incX2(idx, inc); };
313 auto lfun2 = [
this](Eigen::VectorXd& values) {
fun2(values); };
320 auto linc3 = [
this](
int idx,
double inc) {
incX3(idx, inc); };
321 auto lfun3 = [
this](Eigen::VectorXd& values) {
fun3(values); };
332 auto linc1 = [
this](
int idx,
double inc) {
incX1(idx, inc); };
333 auto lfun1 = [
this](Eigen::VectorXd& values) {
fun1(values); };
340 auto linc2 = [
this](
int idx,
double inc) {
incX2(idx, inc); };
341 auto lfun2 = [
this](Eigen::VectorXd& values) {
fun2(values); };
348 auto linc3 = [
this](
int idx,
double inc) {
incX3(idx, inc); };
349 auto lfun3 = [
this](Eigen::VectorXd& values) {
fun3(values); };
#define EXPECT_ZERO_MATRIX(A, tol)
Eigen::Matrix3d hessian3_sol_a
void incX3(int idx, double inc)
Eigen::Matrix< double, 1, 2 > jacobian2_sol
Eigen::Matrix2d hessian2_sol
void computeJacobianAndHessian2(std::function< void(int, const double &)> inc_fun, std::function< void(Eigen::VectorXd &)> eval_fun, Eigen::Ref< Eigen::MatrixXd > jacobian, Eigen::Ref< Eigen::MatrixXd > hessian, const double *multipliers=nullptr) override
Compute Jacobian and Hessian of a desired function (overload which accepts a slightly different callb...
TEST_F(TestFiniteDifferences, forward_differences_jacobian)
void computeJacobian2(std::function< void(int, const double &)> inc_fun, std::function< void(Eigen::VectorXd &)> eval_fun, Eigen::Ref< Eigen::MatrixXd > jacobian) override
Compute Jacobian of a desired function (overload which accepts a slightly different callback function...
Eigen::Matrix3d hessian3_sol_b
Eigen::Matrix3d jacobian1_sol
void incX1(int idx, double inc)
void computeJacobianAndHessian2(std::function< void(int, const double &)> inc_fun, std::function< void(Eigen::VectorXd &)> eval_fun, Eigen::Ref< Eigen::MatrixXd > jacobian, Eigen::Ref< Eigen::MatrixXd > hessian, const double *multipliers=nullptr) override
Compute Jacobian and Hessian of a desired function (overload which accepts a slightly different callb...
Finite differences via central differences.
Eigen::Map< const Eigen::Vector2d > multipliers3_vec
void computeHessian2(std::function< void(int, const double &)> inc_fun, std::function< void(Eigen::VectorXd &)> eval_fun, int dim_f, Eigen::Ref< Eigen::MatrixXd > hessian, const double *multipliers=nullptr) override
Compute Hessian of a desired function (overload which accepts a slightly different callback function)...
void fun1(Eigen::VectorXd &values)
Eigen::Matrix< double, 1, 2 > jacobian2
virtual ~TestFiniteDifferences()
void incX2(int idx, double inc)
Eigen::Map< const Eigen::Vector3d > multipliers1_vec
void computeJacobian2(std::function< void(int, const double &)> inc_fun, std::function< void(Eigen::VectorXd &)> eval_fun, Eigen::Ref< Eigen::MatrixXd > jacobian) override
Compute Jacobian of a desired function (overload which accepts a slightly different callback function...
Eigen::Matrix< double, 2, 3 > jacobian3_sol
Eigen::Map< const Eigen::Matrix< double, 1, 1 > > multipliers2_vec
Eigen::Matrix< double, 2, 3 > jacobian3
#define EXPECT_EQ_MATRIX(A, B, tol)
void fun3(Eigen::VectorXd &values)
void computeHessian2(std::function< void(int, const double &)> inc_fun, std::function< void(Eigen::VectorXd &)> eval_fun, int dim_f, Eigen::Ref< Eigen::MatrixXd > hessian, const double *multipliers=nullptr) override
Compute Hessian of a desired function (overload which accepts a slightly different callback function)...
void fun2(Eigen::VectorXd &values)
Eigen::Matrix3d jacobian1
Finite differences via forward differences.
Interface class for finite difference approaches.