32 template <
typename SCALAR>
33 Eigen::Matrix<SCALAR, outDim, 1>
testFunction(
const Eigen::Matrix<SCALAR, inDim, 1>& x)
35 Eigen::Matrix<SCALAR, outDim, 1> y;
37 y(0) = 3 * x(0) + 2 * x(0) * x(0) - x(1) * x(2);
38 y(1) = x(2) + x(1) + 3;
49 template <
typename SCALAR>
50 Eigen::Matrix<SCALAR, outDim, inDim>
jacobianCheck(
const Eigen::Matrix<SCALAR, inDim, 1>& x)
52 Eigen::Matrix<SCALAR, outDim, inDim> jac;
54 jac << 3 + 4 * x(0), -x(2), -x(1), 0, 1, 1;
59 template <
typename SCALAR>
60 Eigen::Matrix<SCALAR, inDim, inDim>
hessianCheck(
const Eigen::Matrix<SCALAR, inDim, 1>& x,
61 const Eigen::Matrix<SCALAR, outDim, 1>& w)
63 Eigen::Matrix<SCALAR, inDim, inDim> hes;
65 hes << 4, 0, 0, 0, 0, -1, 0, -1, 0;
74 typename derivativesCppadJIT::FUN_TYPE_CG f_cg = testFunction<derivativesCppadJIT::CG_SCALAR>;
75 typename derivativesCppad::FUN_TYPE_AD f_ad = testFunction<derivativesCppad::AD_SCALAR>;
81 DerivativesCppadSettings settings;
82 settings.createForwardZero_ =
true;
83 settings.createJacobian_ =
true;
84 settings.useDynamicLibrary_ = useDynamicLib;
87 Eigen::VectorXd someVec(
inDim);
91 Eigen::VectorXd vecOut = jacAd.forwardZero(someVec);
94 jacCG.compileJIT(settings,
"forwardZeroTestLib",
verbose);
97 Eigen::VectorXd vecOut2 = jacCG.forwardZero(someVec);
100 ASSERT_LT((vecOut - vecOut2).array().abs().maxCoeff(), 1e-10);
107 typename derivativesCppadJIT::FUN_TYPE_CG f = testFunction<derivativesCppadJIT::CG_SCALAR>;
108 typename derivativesCppad::FUN_TYPE_AD f_ad = testFunction<derivativesCppad::AD_SCALAR>;
114 DerivativesCppadSettings settings;
115 settings.createJacobian_ =
true;
116 settings.useDynamicLibrary_ = useDynamicLib;
119 jacCG.compileJIT(settings,
"jacobianCGLib",
verbose);
122 Eigen::Matrix<double, inDim, 1>
x;
124 for (
size_t i = 0;
i < 1000;
i++)
130 ASSERT_LT((jacCG.jacobian(x) -
jacobianCheck(x)).array().abs().maxCoeff(), 1e-10);
131 ASSERT_LT((jacAd.jacobian(x) -
jacobianCheck(x)).array().abs().maxCoeff(), 1e-10);
132 ASSERT_LT((jacCG.jacobian(x) - jacAd.jacobian(x)).array().abs().maxCoeff(), 1e-10);
139 typename derivativesCppadJIT::FUN_TYPE_CG f = testFunction<derivativesCppadJIT::CG_SCALAR>;
140 typename derivativesCppad::FUN_TYPE_AD f_ad = testFunction<derivativesCppad::AD_SCALAR>;
145 DerivativesCppadSettings settings;
146 settings.createHessian_ =
true;
147 settings.useDynamicLibrary_ = useDynamicLib;
149 hessianCg.compileJIT(settings,
"hessianCGLib",
verbose);
151 Eigen::Matrix<double, inDim, 1>
x;
152 Eigen::Matrix<double, outDim, 1> w;
154 for (
size_t i = 0;
i < 1000; ++
i)
159 ASSERT_LT((hessianCg.hessian(x, w) -
hessianCheck(x, w)).array().abs().maxCoeff(), 1e-10);
160 ASSERT_LT((hessianAd.hessian(x, w) -
hessianCheck(x, w)).array().abs().maxCoeff(), 1e-10);
161 ASSERT_LT((hessianCg.hessian(x, w) - hessianAd.hessian(x, w)).array().abs().maxCoeff(), 1e-10);
168 typename derivativesCppadJIT::FUN_TYPE_CG f = testFunction<derivativesCppadJIT::CG_SCALAR>;
169 typename derivativesCppad::FUN_TYPE_AD f_ad = testFunction<derivativesCppad::AD_SCALAR>;
175 DerivativesCppadSettings settings;
176 settings.createJacobian_ =
true;
177 settings.useDynamicLibrary_ = useDynamicLib;
180 jacCG->compileJIT(settings,
"jacobianCGLib",
verbose);
183 Eigen::Matrix<double, inDim, 1>
x;
185 std::shared_ptr<derivativesCppadJIT> jacCG_cloned(jacCG->clone());
188 if (useDynamicLib && (jacCG_cloned->getDynamicLib() == jacCG->getDynamicLib()))
190 std::cout <<
"FATAL ERROR: dynamic library not cloned correctly in JIT." << std::endl;
194 if (!useDynamicLib && (jacCG_cloned->getLlvmLib() == jacCG->getLlvmLib()))
196 std::cout <<
"FATAL ERROR: Llvm library not cloned correctly in JIT." << std::endl;
201 for (
size_t i = 0;
i < 100;
i++)
207 ASSERT_LT((jacCG_cloned->jacobian(x) -
jacobianCheck(x)).array().abs().maxCoeff(), 1e-10);
208 ASSERT_LT((jacCG_cloned->jacobian(x) - jacAd->jacobian(x)).array().abs().maxCoeff(), 1e-10);
215 TEST(JacobianCGTest, ForwardZeroTest)
224 }
catch (std::exception& e)
226 std::cout <<
"Exception thrown: " << e.what() << std::endl;
234 TEST(JacobianCGTest, JITCompilationTest)
243 }
catch (std::exception& e)
245 std::cout <<
"Exception thrown: " << e.what() << std::endl;
250 TEST(HessianCGTest, JITHessianTest)
258 }
catch (std::exception& e)
260 std::cout <<
"Exception thrown: " << e.what() << std::endl;
268 TEST(JacobianCGTest, DISABLED_LlvmCloneTest)
273 }
catch (std::exception& e)
275 std::cout <<
"Exception thrown: " << e.what() << std::endl;
283 TEST(JacobianCGTest, JitCloneTest)
288 }
catch (std::exception& e)
290 std::cout <<
"Exception thrown: " << e.what() << std::endl;
299 TEST(JacobianCGTest, CodegenTest)
302 typename derivativesCppadCG::FUN_TYPE_CG f = testFunction<derivativesCppadCG::CG_SCALAR>;
308 jacCG.generateJacobianSource(
"TestJacobian");
311 jacCG.generateForwardZeroSource(
"TestForwardZero");
313 jacCG.generateHessianSource(
"TestHessian");
void executeForwardZeroTest(const bool useDynamicLib)
Definition: JacobianCGTest.h:71
void executeJITCompilationTest(bool useDynamicLib)
Definition: JacobianCGTest.h:104
TEST(JacobianCGTest, ForwardZeroTest)
Definition: JacobianCGTest.h:215
Eigen::Matrix< SCALAR, outDim, 1 > testFunction(const Eigen::Matrix< SCALAR, inDim, 1 > &x)
Definition: JacobianCGTest.h:33
const size_t outDim
dimension of y
Definition: JacobianCGTest.h:18
void executeJITCloneTest(bool useDynamicLib)
Definition: JacobianCGTest.h:166
DerivativesCppadCG< inDim, outDim > derivativesCppadCG
Definition: JacobianCGTest.h:23
DerivativesCppad< inDim, outDim > derivativesCppad
Definition: JacobianCGTest.h:24
void executeJitHessianTest(bool useDynamicLib)
Definition: JacobianCGTest.h:137
DerivativesCppadJIT< inDim, outDim > derivativesCppadJIT
the Jacobian codegen class
Definition: JacobianCGTest.h:22
ct::core::StateVector< state_dim > x
const size_t inDim
dimension of x
Definition: JacobianCGTest.h:17
const bool verbose
Definition: JacobianCGTest.h:19
Eigen::Matrix< SCALAR, inDim, inDim > hessianCheck(const Eigen::Matrix< SCALAR, inDim, 1 > &x, const Eigen::Matrix< SCALAR, outDim, 1 > &w)
Definition: JacobianCGTest.h:60
Eigen::Matrix< SCALAR, outDim, inDim > jacobianCheck(const Eigen::Matrix< SCALAR, inDim, 1 > &x)
Definition: JacobianCGTest.h:50