|
|
|
@ -71,10 +71,10 @@ typename Eigen::Matrix<double, N, 1> numericalGradient(
|
|
|
|
std::function<double(const X&)> h, const X& x, double delta = 1e-5) {
|
|
|
|
std::function<double(const X&)> h, const X& x, double delta = 1e-5) {
|
|
|
|
double factor = 1.0 / (2.0 * delta);
|
|
|
|
double factor = 1.0 / (2.0 * delta);
|
|
|
|
|
|
|
|
|
|
|
|
BOOST_STATIC_ASSERT_MSG(
|
|
|
|
static_assert(
|
|
|
|
(boost::is_base_of<manifold_tag, typename traits<X>::structure_category>::value),
|
|
|
|
(std::is_base_of<manifold_tag, typename traits<X>::structure_category>::value),
|
|
|
|
"Template argument X must be a manifold type.");
|
|
|
|
"Template argument X must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG(N>0, "Template argument X must be fixed-size type or N must be specified.");
|
|
|
|
static_assert(N>0, "Template argument X must be fixed-size type or N must be specified.");
|
|
|
|
|
|
|
|
|
|
|
|
// Prepare a tangent vector to perturb x with, only works for fixed size
|
|
|
|
// Prepare a tangent vector to perturb x with, only works for fixed size
|
|
|
|
typename traits<X>::TangentVector d;
|
|
|
|
typename traits<X>::TangentVector d;
|
|
|
|
@ -111,13 +111,13 @@ typename internal::FixedSizeMatrix<Y, X>::type numericalDerivative11(
|
|
|
|
std::function<Y(const X&)> h, const X& x, double delta = 1e-5) {
|
|
|
|
std::function<Y(const X&)> h, const X& x, double delta = 1e-5) {
|
|
|
|
typedef typename internal::FixedSizeMatrix<Y,X>::type Matrix;
|
|
|
|
typedef typename internal::FixedSizeMatrix<Y,X>::type Matrix;
|
|
|
|
|
|
|
|
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
typedef traits<Y> TraitsY;
|
|
|
|
typedef traits<Y> TraitsY;
|
|
|
|
|
|
|
|
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X>::structure_category>::value),
|
|
|
|
"Template argument X must be a manifold type.");
|
|
|
|
"Template argument X must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG(N>0, "Template argument X must be fixed-size type or N must be specified.");
|
|
|
|
static_assert(N>0, "Template argument X must be fixed-size type or N must be specified.");
|
|
|
|
typedef traits<X> TraitsX;
|
|
|
|
typedef traits<X> TraitsX;
|
|
|
|
|
|
|
|
|
|
|
|
// get value at x, and corresponding chart
|
|
|
|
// get value at x, and corresponding chart
|
|
|
|
@ -165,9 +165,9 @@ typename internal::FixedSizeMatrix<Y,X>::type numericalDerivative11(Y (*h)(const
|
|
|
|
template<class Y, class X1, class X2, int N = traits<X1>::dimension>
|
|
|
|
template<class Y, class X1, class X2, int N = traits<X1>::dimension>
|
|
|
|
typename internal::FixedSizeMatrix<Y,X1>::type numericalDerivative21(const std::function<Y(const X1&, const X2&)>& h,
|
|
|
|
typename internal::FixedSizeMatrix<Y,X1>::type numericalDerivative21(const std::function<Y(const X1&, const X2&)>& h,
|
|
|
|
const X1& x1, const X2& x2, double delta = 1e-5) {
|
|
|
|
const X1& x1, const X2& x2, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X1, N>(
|
|
|
|
return numericalDerivative11<Y, X1, N>(
|
|
|
|
std::bind(h, std::placeholders::_1, std::cref(x2)), x1, delta);
|
|
|
|
std::bind(h, std::placeholders::_1, std::cref(x2)), x1, delta);
|
|
|
|
@ -194,9 +194,9 @@ typename internal::FixedSizeMatrix<Y,X1>::type numericalDerivative21(Y (*h)(cons
|
|
|
|
template<class Y, class X1, class X2, int N = traits<X2>::dimension>
|
|
|
|
template<class Y, class X1, class X2, int N = traits<X2>::dimension>
|
|
|
|
typename internal::FixedSizeMatrix<Y,X2>::type numericalDerivative22(std::function<Y(const X1&, const X2&)> h,
|
|
|
|
typename internal::FixedSizeMatrix<Y,X2>::type numericalDerivative22(std::function<Y(const X1&, const X2&)> h,
|
|
|
|
const X1& x1, const X2& x2, double delta = 1e-5) {
|
|
|
|
const X1& x1, const X2& x2, double delta = 1e-5) {
|
|
|
|
// BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
// static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
// "Template argument X1 must be a manifold type.");
|
|
|
|
// "Template argument X1 must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X2>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X2>::structure_category>::value),
|
|
|
|
"Template argument X2 must be a manifold type.");
|
|
|
|
"Template argument X2 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X2, N>(
|
|
|
|
return numericalDerivative11<Y, X2, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::placeholders::_1), x2, delta);
|
|
|
|
std::bind(h, std::cref(x1), std::placeholders::_1), x2, delta);
|
|
|
|
@ -226,9 +226,9 @@ template<class Y, class X1, class X2, class X3, int N = traits<X1>::dimension>
|
|
|
|
typename internal::FixedSizeMatrix<Y,X1>::type numericalDerivative31(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X1>::type numericalDerivative31(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X1, N>(
|
|
|
|
return numericalDerivative11<Y, X1, N>(
|
|
|
|
std::bind(h, std::placeholders::_1, std::cref(x2), std::cref(x3)),
|
|
|
|
std::bind(h, std::placeholders::_1, std::cref(x2), std::cref(x3)),
|
|
|
|
@ -259,9 +259,9 @@ template<class Y, class X1, class X2, class X3, int N = traits<X2>::dimension>
|
|
|
|
typename internal::FixedSizeMatrix<Y,X2>::type numericalDerivative32(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X2>::type numericalDerivative32(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X2>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X2>::structure_category>::value),
|
|
|
|
"Template argument X2 must be a manifold type.");
|
|
|
|
"Template argument X2 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X2, N>(
|
|
|
|
return numericalDerivative11<Y, X2, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::placeholders::_1, std::cref(x3)),
|
|
|
|
std::bind(h, std::cref(x1), std::placeholders::_1, std::cref(x3)),
|
|
|
|
@ -292,9 +292,9 @@ template<class Y, class X1, class X2, class X3, int N = traits<X3>::dimension>
|
|
|
|
typename internal::FixedSizeMatrix<Y,X3>::type numericalDerivative33(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X3>::type numericalDerivative33(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X3>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X3>::structure_category>::value),
|
|
|
|
"Template argument X3 must be a manifold type.");
|
|
|
|
"Template argument X3 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X3, N>(
|
|
|
|
return numericalDerivative11<Y, X3, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::placeholders::_1),
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::placeholders::_1),
|
|
|
|
@ -325,9 +325,9 @@ template<class Y, class X1, class X2, class X3, class X4, int N = traits<X1>::di
|
|
|
|
typename internal::FixedSizeMatrix<Y,X1>::type numericalDerivative41(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X1>::type numericalDerivative41(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X1, N>(
|
|
|
|
return numericalDerivative11<Y, X1, N>(
|
|
|
|
std::bind(h, std::placeholders::_1, std::cref(x2), std::cref(x3),
|
|
|
|
std::bind(h, std::placeholders::_1, std::cref(x2), std::cref(x3),
|
|
|
|
@ -359,9 +359,9 @@ template<class Y, class X1, class X2, class X3, class X4, int N = traits<X2>::di
|
|
|
|
typename internal::FixedSizeMatrix<Y,X2>::type numericalDerivative42(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X2>::type numericalDerivative42(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X2>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X2>::structure_category>::value),
|
|
|
|
"Template argument X2 must be a manifold type.");
|
|
|
|
"Template argument X2 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X2, N>(
|
|
|
|
return numericalDerivative11<Y, X2, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::placeholders::_1, std::cref(x3),
|
|
|
|
std::bind(h, std::cref(x1), std::placeholders::_1, std::cref(x3),
|
|
|
|
@ -393,9 +393,9 @@ template<class Y, class X1, class X2, class X3, class X4, int N = traits<X3>::di
|
|
|
|
typename internal::FixedSizeMatrix<Y,X3>::type numericalDerivative43(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X3>::type numericalDerivative43(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X3>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X3>::structure_category>::value),
|
|
|
|
"Template argument X3 must be a manifold type.");
|
|
|
|
"Template argument X3 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X3, N>(
|
|
|
|
return numericalDerivative11<Y, X3, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::placeholders::_1,
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::placeholders::_1,
|
|
|
|
@ -427,9 +427,9 @@ template<class Y, class X1, class X2, class X3, class X4, int N = traits<X4>::di
|
|
|
|
typename internal::FixedSizeMatrix<Y,X4>::type numericalDerivative44(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X4>::type numericalDerivative44(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X4>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X4>::structure_category>::value),
|
|
|
|
"Template argument X4 must be a manifold type.");
|
|
|
|
"Template argument X4 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X4, N>(
|
|
|
|
return numericalDerivative11<Y, X4, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::cref(x3),
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::cref(x3),
|
|
|
|
@ -462,9 +462,9 @@ template<class Y, class X1, class X2, class X3, class X4, class X5, int N = trai
|
|
|
|
typename internal::FixedSizeMatrix<Y,X1>::type numericalDerivative51(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X1>::type numericalDerivative51(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X1, N>(
|
|
|
|
return numericalDerivative11<Y, X1, N>(
|
|
|
|
std::bind(h, std::placeholders::_1, std::cref(x2), std::cref(x3),
|
|
|
|
std::bind(h, std::placeholders::_1, std::cref(x2), std::cref(x3),
|
|
|
|
@ -498,9 +498,9 @@ template<class Y, class X1, class X2, class X3, class X4, class X5, int N = trai
|
|
|
|
typename internal::FixedSizeMatrix<Y,X2>::type numericalDerivative52(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X2>::type numericalDerivative52(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X2, N>(
|
|
|
|
return numericalDerivative11<Y, X2, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::placeholders::_1, std::cref(x3),
|
|
|
|
std::bind(h, std::cref(x1), std::placeholders::_1, std::cref(x3),
|
|
|
|
@ -534,9 +534,9 @@ template<class Y, class X1, class X2, class X3, class X4, class X5, int N = trai
|
|
|
|
typename internal::FixedSizeMatrix<Y,X3>::type numericalDerivative53(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X3>::type numericalDerivative53(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X3, N>(
|
|
|
|
return numericalDerivative11<Y, X3, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::placeholders::_1,
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::placeholders::_1,
|
|
|
|
@ -570,9 +570,9 @@ template<class Y, class X1, class X2, class X3, class X4, class X5, int N = trai
|
|
|
|
typename internal::FixedSizeMatrix<Y,X4>::type numericalDerivative54(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X4>::type numericalDerivative54(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X4, N>(
|
|
|
|
return numericalDerivative11<Y, X4, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::cref(x3),
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::cref(x3),
|
|
|
|
@ -606,9 +606,9 @@ template<class Y, class X1, class X2, class X3, class X4, class X5, int N = trai
|
|
|
|
typename internal::FixedSizeMatrix<Y,X5>::type numericalDerivative55(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X5>::type numericalDerivative55(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X5, N>(
|
|
|
|
return numericalDerivative11<Y, X5, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::cref(x3),
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::cref(x3),
|
|
|
|
@ -643,9 +643,9 @@ template<class Y, class X1, class X2, class X3, class X4, class X5, class X6, in
|
|
|
|
typename internal::FixedSizeMatrix<Y,X1>::type numericalDerivative61(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X1>::type numericalDerivative61(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&, const X6&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&, const X6&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X1, N>(
|
|
|
|
return numericalDerivative11<Y, X1, N>(
|
|
|
|
std::bind(h, std::placeholders::_1, std::cref(x2), std::cref(x3),
|
|
|
|
std::bind(h, std::placeholders::_1, std::cref(x2), std::cref(x3),
|
|
|
|
@ -680,9 +680,9 @@ template<class Y, class X1, class X2, class X3, class X4, class X5, class X6, in
|
|
|
|
typename internal::FixedSizeMatrix<Y,X2>::type numericalDerivative62(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X2>::type numericalDerivative62(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&, const X6&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&, const X6&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X2, N>(
|
|
|
|
return numericalDerivative11<Y, X2, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::placeholders::_1, std::cref(x3),
|
|
|
|
std::bind(h, std::cref(x1), std::placeholders::_1, std::cref(x3),
|
|
|
|
@ -717,9 +717,9 @@ template<class Y, class X1, class X2, class X3, class X4, class X5, class X6, in
|
|
|
|
typename internal::FixedSizeMatrix<Y,X3>::type numericalDerivative63(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X3>::type numericalDerivative63(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&, const X6&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&, const X6&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X3, N>(
|
|
|
|
return numericalDerivative11<Y, X3, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::placeholders::_1,
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::placeholders::_1,
|
|
|
|
@ -754,9 +754,9 @@ template<class Y, class X1, class X2, class X3, class X4, class X5, class X6, in
|
|
|
|
typename internal::FixedSizeMatrix<Y,X4>::type numericalDerivative64(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X4>::type numericalDerivative64(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&, const X6&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&, const X6&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X4, N>(
|
|
|
|
return numericalDerivative11<Y, X4, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::cref(x3),
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::cref(x3),
|
|
|
|
@ -791,9 +791,9 @@ template<class Y, class X1, class X2, class X3, class X4, class X5, class X6, in
|
|
|
|
typename internal::FixedSizeMatrix<Y,X5>::type numericalDerivative65(
|
|
|
|
typename internal::FixedSizeMatrix<Y,X5>::type numericalDerivative65(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&, const X6&)> h, const X1& x1,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&, const X6&)> h, const X1& x1,
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6, double delta = 1e-5) {
|
|
|
|
const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6, double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X5, N>(
|
|
|
|
return numericalDerivative11<Y, X5, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::cref(x3),
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::cref(x3),
|
|
|
|
@ -829,9 +829,9 @@ typename internal::FixedSizeMatrix<Y, X6>::type numericalDerivative66(
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&, const X6&)> h,
|
|
|
|
std::function<Y(const X1&, const X2&, const X3&, const X4&, const X5&, const X6&)> h,
|
|
|
|
const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6,
|
|
|
|
const X1& x1, const X2& x2, const X3& x3, const X4& x4, const X5& x5, const X6& x6,
|
|
|
|
double delta = 1e-5) {
|
|
|
|
double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<Y>::structure_category>::value),
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
"Template argument Y must be a manifold type.");
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X1>::structure_category>::value),
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
"Template argument X1 must be a manifold type.");
|
|
|
|
return numericalDerivative11<Y, X6, N>(
|
|
|
|
return numericalDerivative11<Y, X6, N>(
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::cref(x3),
|
|
|
|
std::bind(h, std::cref(x1), std::cref(x2), std::cref(x3),
|
|
|
|
@ -860,7 +860,7 @@ inline typename internal::FixedSizeMatrix<Y,X6>::type numericalDerivative66(Y (*
|
|
|
|
template<class X>
|
|
|
|
template<class X>
|
|
|
|
inline typename internal::FixedSizeMatrix<X,X>::type numericalHessian(std::function<double(const X&)> f, const X& x,
|
|
|
|
inline typename internal::FixedSizeMatrix<X,X>::type numericalHessian(std::function<double(const X&)> f, const X& x,
|
|
|
|
double delta = 1e-5) {
|
|
|
|
double delta = 1e-5) {
|
|
|
|
BOOST_STATIC_ASSERT_MSG( (boost::is_base_of<gtsam::manifold_tag, typename traits<X>::structure_category>::value),
|
|
|
|
static_assert( (std::is_base_of<gtsam::manifold_tag, typename traits<X>::structure_category>::value),
|
|
|
|
"Template argument X must be a manifold type.");
|
|
|
|
"Template argument X must be a manifold type.");
|
|
|
|
typedef Eigen::Matrix<double, traits<X>::dimension, 1> VectorD;
|
|
|
|
typedef Eigen::Matrix<double, traits<X>::dimension, 1> VectorD;
|
|
|
|
typedef std::function<double(const X&)> F;
|
|
|
|
typedef std::function<double(const X&)> F;
|
|
|
|
|