58template <
class Y,
class X =
double>
65template <
int M,
int N>
67 typedef Eigen::Matrix<double, M, N> type;
73template <
class RequestedY,
class F,
class... Args>
75 std::conditional_t<std::is_same_v<RequestedY, DeducedOutput>,
76 std::decay_t<std::invoke_result_t<F&,
const Args&...>>,
79template <
class F,
class... Args>
80using EnableIfInvocable =
81 std::enable_if_t<std::is_invocable_v<F&,
const Args&...>,
int>;
83template <
class F,
class... Args>
84using EnableIfScalarInvocable =
85 std::enable_if_t<std::is_invocable_r_v<double, F&,
const Args&...>,
int>;
87template <
class X,
int N>
88constexpr void ValidateGradientInput() {
91 "Template argument X must be a manifold type.");
94 "Template argument X must be fixed-size type or N must be specified.");
97template <
class Y,
class X,
int N>
98constexpr void ValidateUnaryDerivativeTypes() {
101 "Template argument Y must be a manifold type.");
102 ValidateGradientInput<X, N>();
131template <class X, int N = traits<X>::dimension,
class F,
132 internal::EnableIfScalarInvocable<F, X> = 0>
134 double delta = 1e-5) {
135 internal::ValidateGradientInput<X, N>();
136 double factor = 1.0 / (2.0 * delta);
139 Eigen::Matrix<double, N, 1> d;
142 Eigen::Matrix<double, N, 1> g;
144 for (
int j = 0; j < N; j++) {
150 g(j) = (hx_plus - hx_min) * factor;
156template <class X, int N = traits<X>::dimension>
159 double delta = 1e-5) {
175template <
class Y = internal::DeducedOutput,
class X,
176 int N = traits<X>::dimension,
class F,
177 internal::EnableIfInvocable<F, X> = 0>
178typename internal::MatrixMN<traits<internal::OutputType<Y, F, X>>::dimension,
181 using ActualY = internal::OutputType<Y, F, X>;
182 internal::ValidateUnaryDerivativeTypes<ActualY, X, N>();
189 const ActualY hx = std::invoke(h, x);
192 const size_t m = TraitsY::GetDimension(hx);
195 Eigen::Matrix<double, N, 1> dx;
199 MatrixYN H = MatrixYN::Zero(m, N);
200 const double factor = 1.0 / (2.0 * delta);
201 for (
int j = 0; j < N; j++) {
204 TraitsY::Local(hx, std::invoke(h, TraitsX::Retract(x, dx)));
207 TraitsY::Local(hx, std::invoke(h, TraitsX::Retract(x, dx)));
209 H.col(j) = (dy1 - dy2) * factor;
215template <class Y, class X, int N = traits<X>::dimension>
216typename internal::MatrixMN<traits<Y>::dimension, N>::type
231template <
class Y = internal::DeducedOutput,
class X1,
class X2,
232 int N = traits<X1>::dimension,
class F,
233 internal::EnableIfInvocable<F, X1, X2> = 0>
234typename internal::MatrixMN<
235 traits<internal::OutputType<Y, F, X1, X2>>::dimension, N>::type
237 using ActualY = internal::OutputType<Y, F, X1, X2>;
239 [&](
const X1& x1_) {
return std::invoke(h, x1_, x2); }, x1, delta);
243template <class Y, class X1, class X2, int N = traits<X1>::dimension>
244typename internal::MatrixMN<traits<Y>::dimension, N>::type
246 double delta = 1e-5) {
248 [&](
const X1& x1_) {
return h(x1_, x2); }, x1, delta);
260template <
class Y = internal::DeducedOutput,
class X1,
class X2,
261 int N = traits<X2>::dimension,
class F,
262 internal::EnableIfInvocable<F, X1, X2> = 0>
263typename internal::MatrixMN<
264 traits<internal::OutputType<Y, F, X1, X2>>::dimension, N>::type
266 using ActualY = internal::OutputType<Y, F, X1, X2>;
268 [&](
const X2& x2_) {
return std::invoke(h, x1, x2_); }, x2, delta);
272template <class Y, class X1, class X2, int N = traits<X2>::dimension>
273typename internal::MatrixMN<traits<Y>::dimension, N>::type
275 double delta = 1e-5) {
277 [&](
const X2& x2_) {
return h(x1, x2_); }, x2, delta);
289template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
290 int N = traits<X1>::dimension,
class F,
291 internal::EnableIfInvocable<F, X1, X2, X3> = 0>
292typename internal::MatrixMN<
293 traits<internal::OutputType<Y, F, X1, X2, X3>>::dimension, N>::type
295 double delta = 1e-5) {
296 using ActualY = internal::OutputType<Y, F, X1, X2, X3>;
298 [&](
const X1& x1_) {
return std::invoke(h, x1_, x2, x3); }, x1, delta);
302template <class Y, class X1, class X2, class X3, int N = traits<X1>::dimension>
303typename internal::MatrixMN<traits<Y>::dimension, N>::type
305 const X2& x2,
const X3& x3,
double delta = 1e-5) {
307 [&](
const X1& x1_) {
return h(x1_, x2, x3); }, x1, delta);
319template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
320 int N = traits<X2>::dimension,
class F,
321 internal::EnableIfInvocable<F, X1, X2, X3> = 0>
322typename internal::MatrixMN<
323 traits<internal::OutputType<Y, F, X1, X2, X3>>::dimension, N>::type
325 double delta = 1e-5) {
326 using ActualY = internal::OutputType<Y, F, X1, X2, X3>;
328 [&](
const X2& x2_) {
return std::invoke(h, x1, x2_, x3); }, x2, delta);
332template <class Y, class X1, class X2, class X3, int N = traits<X2>::dimension>
333typename internal::MatrixMN<traits<Y>::dimension, N>::type
335 const X2& x2,
const X3& x3,
double delta = 1e-5) {
337 [&](
const X2& x2_) {
return h(x1, x2_, x3); }, x2, delta);
349template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
350 int N = traits<X3>::dimension,
class F,
351 internal::EnableIfInvocable<F, X1, X2, X3> = 0>
352typename internal::MatrixMN<
353 traits<internal::OutputType<Y, F, X1, X2, X3>>::dimension, N>::type
355 double delta = 1e-5) {
356 using ActualY = internal::OutputType<Y, F, X1, X2, X3>;
358 [&](
const X3& x3_) {
return std::invoke(h, x1, x2, x3_); }, x3, delta);
362template <class Y, class X1, class X2, class X3, int N = traits<X3>::dimension>
363typename internal::MatrixMN<traits<Y>::dimension, N>::type
365 const X2& x2,
const X3& x3,
double delta = 1e-5) {
367 [&](
const X3& x3_) {
return h(x1, x2, x3_); }, x3, delta);
379template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
380 class X4,
int N = traits<X1>::dimension,
class F,
381 internal::EnableIfInvocable<F, X1, X2, X3, X4> = 0>
382typename internal::MatrixMN<
383 traits<internal::OutputType<Y, F, X1, X2, X3, X4>>::dimension, N>::type
385 const X4& x4,
double delta = 1e-5) {
386 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4>;
388 [&](
const X1& x1_) {
return std::invoke(h, x1_, x2, x3, x4); }, x1,
393template <
class Y,
class X1,
class X2,
class X3,
class X4,
394 int N = traits<X1>::dimension>
395typename internal::MatrixMN<traits<Y>::dimension, N>::type
397 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
398 double delta = 1e-5) {
400 [&](
const X1& x1_) {
return h(x1_, x2, x3, x4); }, x1, delta);
412template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
413 class X4,
int N = traits<X2>::dimension,
class F,
414 internal::EnableIfInvocable<F, X1, X2, X3, X4> = 0>
415typename internal::MatrixMN<
416 traits<internal::OutputType<Y, F, X1, X2, X3, X4>>::dimension, N>::type
418 const X4& x4,
double delta = 1e-5) {
419 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4>;
421 [&](
const X2& x2_) {
return std::invoke(h, x1, x2_, x3, x4); }, x2,
426template <
class Y,
class X1,
class X2,
class X3,
class X4,
427 int N = traits<X2>::dimension>
428typename internal::MatrixMN<traits<Y>::dimension, N>::type
430 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
431 double delta = 1e-5) {
433 [&](
const X2& x2_) {
return h(x1, x2_, x3, x4); }, x2, delta);
445template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
446 class X4,
int N = traits<X3>::dimension,
class F,
447 internal::EnableIfInvocable<F, X1, X2, X3, X4> = 0>
448typename internal::MatrixMN<
449 traits<internal::OutputType<Y, F, X1, X2, X3, X4>>::dimension, N>::type
451 const X4& x4,
double delta = 1e-5) {
452 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4>;
454 [&](
const X3& x3_) {
return std::invoke(h, x1, x2, x3_, x4); }, x3,
459template <
class Y,
class X1,
class X2,
class X3,
class X4,
460 int N = traits<X3>::dimension>
461typename internal::MatrixMN<traits<Y>::dimension, N>::type
463 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
464 double delta = 1e-5) {
466 [&](
const X3& x3_) {
return h(x1, x2, x3_, x4); }, x3, delta);
478template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
479 class X4,
int N = traits<X4>::dimension,
class F,
480 internal::EnableIfInvocable<F, X1, X2, X3, X4> = 0>
481typename internal::MatrixMN<
482 traits<internal::OutputType<Y, F, X1, X2, X3, X4>>::dimension, N>::type
484 const X4& x4,
double delta = 1e-5) {
485 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4>;
487 [&](
const X4& x4_) {
return std::invoke(h, x1, x2, x3, x4_); }, x4,
492template <
class Y,
class X1,
class X2,
class X3,
class X4,
493 int N = traits<X4>::dimension>
494typename internal::MatrixMN<traits<Y>::dimension, N>::type
496 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
497 double delta = 1e-5) {
499 [&](
const X4& x4_) {
return h(x1, x2, x3, x4_); }, x4, delta);
511template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
512 class X4,
class X5,
int N = traits<X1>::dimension,
class F,
513 internal::EnableIfInvocable<F, X1, X2, X3, X4, X5> = 0>
514typename internal::MatrixMN<
515 traits<internal::OutputType<Y, F, X1, X2, X3, X4, X5>>::dimension, N>::type
517 const X4& x4,
const X5& x5,
double delta = 1e-5) {
518 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4, X5>;
520 [&](
const X1& x1_) {
return std::invoke(h, x1_, x2, x3, x4, x5); }, x1,
525template <
class Y,
class X1,
class X2,
class X3,
class X4,
class X5,
526 int N = traits<X1>::dimension>
527typename internal::MatrixMN<traits<Y>::dimension, N>::type
530 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
531 const X5& x5,
double delta = 1e-5) {
533 [&](
const X1& x1_) {
return h(x1_, x2, x3, x4, x5); }, x1, delta);
545template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
546 class X4,
class X5,
int N = traits<X2>::dimension,
class F,
547 internal::EnableIfInvocable<F, X1, X2, X3, X4, X5> = 0>
548typename internal::MatrixMN<
549 traits<internal::OutputType<Y, F, X1, X2, X3, X4, X5>>::dimension, N>::type
551 const X4& x4,
const X5& x5,
double delta = 1e-5) {
552 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4, X5>;
554 [&](
const X2& x2_) {
return std::invoke(h, x1, x2_, x3, x4, x5); }, x2,
559template <
class Y,
class X1,
class X2,
class X3,
class X4,
class X5,
560 int N = traits<X2>::dimension>
561typename internal::MatrixMN<traits<Y>::dimension, N>::type
564 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
565 const X5& x5,
double delta = 1e-5) {
567 [&](
const X2& x2_) {
return h(x1, x2_, x3, x4, x5); }, x2, delta);
579template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
580 class X4,
class X5,
int N = traits<X3>::dimension,
class F,
581 internal::EnableIfInvocable<F, X1, X2, X3, X4, X5> = 0>
582typename internal::MatrixMN<
583 traits<internal::OutputType<Y, F, X1, X2, X3, X4, X5>>::dimension, N>::type
585 const X4& x4,
const X5& x5,
double delta = 1e-5) {
586 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4, X5>;
588 [&](
const X3& x3_) {
return std::invoke(h, x1, x2, x3_, x4, x5); }, x3,
593template <
class Y,
class X1,
class X2,
class X3,
class X4,
class X5,
594 int N = traits<X3>::dimension>
595typename internal::MatrixMN<traits<Y>::dimension, N>::type
598 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
599 const X5& x5,
double delta = 1e-5) {
601 [&](
const X3& x3_) {
return h(x1, x2, x3_, x4, x5); }, x3, delta);
613template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
614 class X4,
class X5,
int N = traits<X4>::dimension,
class F,
615 internal::EnableIfInvocable<F, X1, X2, X3, X4, X5> = 0>
616typename internal::MatrixMN<
617 traits<internal::OutputType<Y, F, X1, X2, X3, X4, X5>>::dimension, N>::type
619 const X4& x4,
const X5& x5,
double delta = 1e-5) {
620 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4, X5>;
622 [&](
const X4& x4_) {
return std::invoke(h, x1, x2, x3, x4_, x5); }, x4,
627template <
class Y,
class X1,
class X2,
class X3,
class X4,
class X5,
628 int N = traits<X4>::dimension>
629typename internal::MatrixMN<traits<Y>::dimension, N>::type
632 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
633 const X5& x5,
double delta = 1e-5) {
635 [&](
const X4& x4_) {
return h(x1, x2, x3, x4_, x5); }, x4, delta);
647template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
648 class X4,
class X5,
int N = traits<X5>::dimension,
class F,
649 internal::EnableIfInvocable<F, X1, X2, X3, X4, X5> = 0>
650typename internal::MatrixMN<
651 traits<internal::OutputType<Y, F, X1, X2, X3, X4, X5>>::dimension, N>::type
653 const X4& x4,
const X5& x5,
double delta = 1e-5) {
654 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4, X5>;
656 [&](
const X5& x5_) {
return std::invoke(h, x1, x2, x3, x4, x5_); }, x5,
661template <
class Y,
class X1,
class X2,
class X3,
class X4,
class X5,
662 int N = traits<X5>::dimension>
663typename internal::MatrixMN<traits<Y>::dimension, N>::type
666 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
667 const X5& x5,
double delta = 1e-5) {
669 [&](
const X5& x5_) {
return h(x1, x2, x3, x4, x5_); }, x5, delta);
681template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
682 class X4,
class X5,
class X6,
int N = traits<X1>::dimension,
class F,
683 internal::EnableIfInvocable<F, X1, X2, X3, X4, X5, X6> = 0>
684typename internal::MatrixMN<
685 traits<internal::OutputType<Y, F, X1, X2, X3, X4, X5, X6>>::dimension,
688 const X4& x4,
const X5& x5,
const X6& x6,
689 double delta = 1e-5) {
690 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4, X5, X6>;
692 [&](
const X1& x1_) {
return std::invoke(h, x1_, x2, x3, x4, x5, x6); },
697template <
class Y,
class X1,
class X2,
class X3,
class X4,
class X5,
class X6,
698 int N = traits<X1>::dimension>
699typename internal::MatrixMN<traits<Y>::dimension, N>::type
701 const X5&,
const X6&),
702 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
703 const X5& x5,
const X6& x6,
double delta = 1e-5) {
705 [&](
const X1& x1_) {
return h(x1_, x2, x3, x4, x5, x6); }, x1, delta);
717template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
718 class X4,
class X5,
class X6,
int N = traits<X2>::dimension,
class F,
719 internal::EnableIfInvocable<F, X1, X2, X3, X4, X5, X6> = 0>
720typename internal::MatrixMN<
721 traits<internal::OutputType<Y, F, X1, X2, X3, X4, X5, X6>>::dimension,
724 const X4& x4,
const X5& x5,
const X6& x6,
725 double delta = 1e-5) {
726 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4, X5, X6>;
728 [&](
const X2& x2_) {
return std::invoke(h, x1, x2_, x3, x4, x5, x6); },
733template <
class Y,
class X1,
class X2,
class X3,
class X4,
class X5,
class X6,
734 int N = traits<X2>::dimension>
735typename internal::MatrixMN<traits<Y>::dimension, N>::type
737 const X5&,
const X6&),
738 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
739 const X5& x5,
const X6& x6,
double delta = 1e-5) {
741 [&](
const X2& x2_) {
return h(x1, x2_, x3, x4, x5, x6); }, x2, delta);
753template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
754 class X4,
class X5,
class X6,
int N = traits<X3>::dimension,
class F,
755 internal::EnableIfInvocable<F, X1, X2, X3, X4, X5, X6> = 0>
756typename internal::MatrixMN<
757 traits<internal::OutputType<Y, F, X1, X2, X3, X4, X5, X6>>::dimension,
760 const X4& x4,
const X5& x5,
const X6& x6,
761 double delta = 1e-5) {
762 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4, X5, X6>;
764 [&](
const X3& x3_) {
return std::invoke(h, x1, x2, x3_, x4, x5, x6); },
769template <
class Y,
class X1,
class X2,
class X3,
class X4,
class X5,
class X6,
770 int N = traits<X3>::dimension>
771typename internal::MatrixMN<traits<Y>::dimension, N>::type
773 const X5&,
const X6&),
774 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
775 const X5& x5,
const X6& x6,
double delta = 1e-5) {
777 [&](
const X3& x3_) {
return h(x1, x2, x3_, x4, x5, x6); }, x3, delta);
789template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
790 class X4,
class X5,
class X6,
int N = traits<X4>::dimension,
class F,
791 internal::EnableIfInvocable<F, X1, X2, X3, X4, X5, X6> = 0>
792typename internal::MatrixMN<
793 traits<internal::OutputType<Y, F, X1, X2, X3, X4, X5, X6>>::dimension,
796 const X4& x4,
const X5& x5,
const X6& x6,
797 double delta = 1e-5) {
798 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4, X5, X6>;
800 [&](
const X4& x4_) {
return std::invoke(h, x1, x2, x3, x4_, x5, x6); },
805template <
class Y,
class X1,
class X2,
class X3,
class X4,
class X5,
class X6,
806 int N = traits<X4>::dimension>
807typename internal::MatrixMN<traits<Y>::dimension, N>::type
809 const X5&,
const X6&),
810 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
811 const X5& x5,
const X6& x6,
double delta = 1e-5) {
813 [&](
const X4& x4_) {
return h(x1, x2, x3, x4_, x5, x6); }, x4, delta);
825template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
826 class X4,
class X5,
class X6,
int N = traits<X5>::dimension,
class F,
827 internal::EnableIfInvocable<F, X1, X2, X3, X4, X5, X6> = 0>
828typename internal::MatrixMN<
829 traits<internal::OutputType<Y, F, X1, X2, X3, X4, X5, X6>>::dimension,
832 const X4& x4,
const X5& x5,
const X6& x6,
833 double delta = 1e-5) {
834 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4, X5, X6>;
836 [&](
const X5& x5_) {
return std::invoke(h, x1, x2, x3, x4, x5_, x6); },
841template <
class Y,
class X1,
class X2,
class X3,
class X4,
class X5,
class X6,
842 int N = traits<X5>::dimension>
843typename internal::MatrixMN<traits<Y>::dimension, N>::type
845 const X5&,
const X6&),
846 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
847 const X5& x5,
const X6& x6,
double delta = 1e-5) {
849 [&](
const X5& x5_) {
return h(x1, x2, x3, x4, x5_, x6); }, x5, delta);
861template <
class Y = internal::DeducedOutput,
class X1,
class X2,
class X3,
862 class X4,
class X5,
class X6,
int N = traits<X6>::dimension,
class F,
863 internal::EnableIfInvocable<F, X1, X2, X3, X4, X5, X6> = 0>
864typename internal::MatrixMN<
865 traits<internal::OutputType<Y, F, X1, X2, X3, X4, X5, X6>>::dimension,
868 const X4& x4,
const X5& x5,
const X6& x6,
869 double delta = 1e-5) {
870 using ActualY = internal::OutputType<Y, F, X1, X2, X3, X4, X5, X6>;
872 [&](
const X6& x6_) {
return std::invoke(h, x1, x2, x3, x4, x5, x6_); },
877template <
class Y,
class X1,
class X2,
class X3,
class X4,
class X5,
class X6,
878 int N = traits<X6>::dimension>
879typename internal::MatrixMN<traits<Y>::dimension, N>::type
881 const X5&,
const X6&),
882 const X1& x1,
const X2& x2,
const X3& x3,
const X4& x4,
883 const X5& x5,
const X6& x6,
double delta = 1e-5) {
885 [&](
const X6& x6_) {
return h(x1, x2, x3, x4, x5, x6_); }, x6, delta);
899template <class X, int N = traits<X>::dimension,
class F,
900 internal::EnableIfScalarInvocable<F, X> = 0>
902 F&& f, const X& x, double delta = 1e-5) {
903 typedef Eigen::Matrix<double, N, 1> VectorD;
910template <class X, int N = traits<X>::dimension>
912 double (&f)(
const X&),
const X& x,
double delta = 1e-5) {
917template <class X1, class X2, int N1 = traits<X1>::dimension,
918 int N2 = traits<X2>::dimension,
class F,
919 internal::EnableIfScalarInvocable<F, X1, X2> = 0>
921 F&& f, const X1& x1, const X2& x2, double delta = 1e-5) {
922 typedef Eigen::Matrix<double, N1, 1> Vector;
926 [&](
const X1& x1_) {
return std::invoke(f, x1_, x2_); }, x1, delta);
932template <class X1, class X2, int N1 = traits<X1>::dimension,
933 int N2 = traits<X2>::dimension>
935 double (&f)(
const X1&,
const X2&),
const X1& x1,
const X2& x2,
936 double delta = 1e-5) {
938 [&](
const X1& x1_,
const X2& x2_) {
return f(x1_, x2_); }, x1, x2, delta);
942template <class X1, class X2, int N1 = traits<X1>::dimension,
class F,
943 internal::EnableIfScalarInvocable<F, X1, X2> = 0>
945 F&& f, const X1& x1, const X2& x2, double delta = 1e-5) {
946 typedef Eigen::Matrix<double, N1, 1> Vector;
950 [&](
const X1& x1__) {
return std::invoke(f, x1__, x2); }, x1_,
957template <class X1, class X2, int N1 = traits<X1>::dimension>
959 double (&f)(
const X1&,
const X2&),
const X1& x1,
const X2& x2,
960 double delta = 1e-5) {
962 [&](
const X1& x1_,
const X2& x2_) {
return f(x1_, x2_); }, x1, x2, delta);
966template <class X1, class X2, int N2 = traits<X2>::dimension,
class F,
967 internal::EnableIfScalarInvocable<F, X1, X2> = 0>
969 F&& f, const X1& x1, const X2& x2, double delta = 1e-5) {
970 typedef Eigen::Matrix<double, N2, 1> Vector;
974 [&](
const X2& x2__) {
return std::invoke(f, x1, x2__); }, x2_,
981template <class X1, class X2, int N2 = traits<X2>::dimension>
983 double (&f)(
const X1&,
const X2&),
const X1& x1,
const X2& x2,
984 double delta = 1e-5) {
986 [&](
const X1& x1_,
const X2& x2_) {
return f(x1_, x2_); }, x1, x2, delta);
994template <class X1, class X2, class X3, int N1 = traits<X1>::dimension,
class F,
995 internal::EnableIfScalarInvocable<F, X1, X2, X3> = 0>
997 F&& f, const X1& x1, const X2& x2, const X3& x3, double delta = 1e-5) {
998 typedef Eigen::Matrix<double, N1, 1> Vector;
1000 [&](
const X1& x1_) {
1002 [&](
const X1& x1__) {
return std::invoke(f, x1__, x2, x3); }, x1_,
1009template <class X1, class X2, class X3, int N1 = traits<X1>::dimension>
1011 double (&f)(
const X1&,
const X2&,
const X3&),
const X1& x1,
const X2& x2,
1012 const X3& x3,
double delta = 1e-5) {
1014 [&](
const X1& x1_,
const X2& x2_,
const X3& x3_) {
1015 return f(x1_, x2_, x3_);
1022template <class X1, class X2, class X3, int N2 = traits<X2>::dimension,
class F,
1023 internal::EnableIfScalarInvocable<F, X1, X2, X3> = 0>
1025 F&& f, const X1& x1, const X2& x2, const X3& x3, double delta = 1e-5) {
1026 typedef Eigen::Matrix<double, N2, 1> Vector;
1028 [&](
const X2& x2_) {
1030 [&](
const X2& x2__) {
return std::invoke(f, x1, x2__, x3); }, x2_,
1037template <class X1, class X2, class X3, int N2 = traits<X2>::dimension>
1039 double (&f)(
const X1&,
const X2&,
const X3&),
const X1& x1,
const X2& x2,
1040 const X3& x3,
double delta = 1e-5) {
1042 [&](
const X1& x1_,
const X2& x2_,
const X3& x3_) {
1043 return f(x1_, x2_, x3_);
1050template <class X1, class X2, class X3, int N3 = traits<X3>::dimension,
class F,
1051 internal::EnableIfScalarInvocable<F, X1, X2, X3> = 0>
1053 F&& f, const X1& x1, const X2& x2, const X3& x3, double delta = 1e-5) {
1054 typedef Eigen::Matrix<double, N3, 1> Vector;
1056 [&](
const X3& x3_) {
1058 [&](
const X3& x3__) {
return std::invoke(f, x1, x2, x3__); }, x3_,
1065template <class X1, class X2, class X3, int N3 = traits<X3>::dimension>
1067 double (&f)(
const X1&,
const X2&,
const X3&),
const X1& x1,
const X2& x2,
1068 const X3& x3,
double delta = 1e-5) {
1070 [&](
const X1& x1_,
const X2& x2_,
const X3& x3_) {
1071 return f(x1_, x2_, x3_);
1079template <class X1, class X2, class X3, int N1 = traits<X1>::dimension,
1080 int N2 = traits<X2>::dimension,
class F,
1081 internal::EnableIfScalarInvocable<F, X1, X2, X3> = 0>
1083 F&& f, const X1& x1, const X2& x2, const X3& x3, double delta = 1e-5) {
1085 [&](
const X1& x1_,
const X2& x2_) {
1086 return std::invoke(f, x1_, x2_, x3);
1093template <class X1, class X2, class X3, int N1 = traits<X1>::dimension,
1094 int N3 = traits<X3>::dimension,
class F,
1095 internal::EnableIfScalarInvocable<F, X1, X2, X3> = 0>
1097 F&& f, const X1& x1, const X2& x2, const X3& x3, double delta = 1e-5) {
1099 [&](
const X1& x1_,
const X3& x3_) {
1100 return std::invoke(f, x1_, x2, x3_);
1107template <class X1, class X2, class X3, int N2 = traits<X2>::dimension,
1108 int N3 = traits<X3>::dimension,
class F,
1109 internal::EnableIfScalarInvocable<F, X1, X2, X3> = 0>
1111 F&& f, const X1& x1, const X2& x2, const X3& x3, double delta = 1e-5) {
1113 [&](
const X2& x2_,
const X3& x3_) {
1114 return std::invoke(f, x1, x2_, x3_);
1121template <class X1, class X2, class X3, int N1 = traits<X1>::dimension,
1122 int N2 = traits<X2>::dimension>
1124 double (&f)(
const X1&,
const X2&,
const X3&),
const X1& x1,
const X2& x2,
1125 const X3& x3,
double delta = 1e-5) {
1127 [&](
const X1& x1_,
const X2& x2_,
const X3& x3_) {
1128 return f(x1_, x2_, x3_);
1134template <class X1, class X2, class X3, int N1 = traits<X1>::dimension,
1135 int N3 = traits<X3>::dimension>
1137 double (&f)(
const X1&,
const X2&,
const X3&),
const X1& x1,
const X2& x2,
1138 const X3& x3,
double delta = 1e-5) {
1140 [&](
const X1& x1_,
const X2& x2_,
const X3& x3_) {
1141 return f(x1_, x2_, x3_);
1147template <class X1, class X2, class X3, int N2 = traits<X2>::dimension,
1148 int N3 = traits<X3>::dimension>
1150 double (&f)(
const X1&,
const X2&,
const X3&),
const X1& x1,
const X2& x2,
1151 const X3& x3,
double delta = 1e-5) {
1153 [&](
const X1& x1_,
const X2& x2_,
const X3& x3_) {
1154 return f(x1_, x2_, x3_);
Base class and basic functions for Lie types.
A non-templated config holding any types of Manifold-group elements.
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3 > >::dimension, N >::type numericalDerivative31(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, double delta=1e-5)
Compute numerical derivative in argument 1 of ternary function.
Definition numericalDerivative.h:294
internal::MatrixMN< N1, N2 >::type numericalHessian312(F &&f, const X1 &x1, const X2 &x2, const X3 &x3, double delta=1e-5)
Mixed Hessian with respect to arguments 1 and 2 of a ternary scalar function.
Definition numericalDerivative.h:1082
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4, X5, X6 > >::dimension, N >::type numericalDerivative64(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, const X5 &x5, const X6 &x6, double delta=1e-5)
Compute numerical derivative in argument 4 of 6-argument function.
Definition numericalDerivative.h:795
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4, X5 > >::dimension, N >::type numericalDerivative51(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, const X5 &x5, double delta=1e-5)
Compute numerical derivative in argument 1 of 5-argument function.
Definition numericalDerivative.h:516
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4, X5 > >::dimension, N >::type numericalDerivative52(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, const X5 &x5, double delta=1e-5)
Compute numerical derivative in argument 2 of 5-argument function.
Definition numericalDerivative.h:550
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4, X5 > >::dimension, N >::type numericalDerivative53(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, const X5 &x5, double delta=1e-5)
Compute numerical derivative in argument 3 of 5-argument function.
Definition numericalDerivative.h:584
internal::MatrixMN< N2, N3 >::type numericalHessian323(F &&f, const X1 &x1, const X2 &x2, const X3 &x3, double delta=1e-5)
Mixed Hessian with respect to arguments 2 and 3 of a ternary scalar function.
Definition numericalDerivative.h:1110
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4, X5, X6 > >::dimension, N >::type numericalDerivative65(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, const X5 &x5, const X6 &x6, double delta=1e-5)
Compute numerical derivative in argument 5 of 6-argument function.
Definition numericalDerivative.h:831
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2 > >::dimension, N >::type numericalDerivative21(F &&h, const X1 &x1, const X2 &x2, double delta=1e-5)
Compute numerical derivative in argument 1 of binary function.
Definition numericalDerivative.h:236
Eigen::Matrix< double, N, 1 > numericalGradient(F &&h, const X &x, double delta=1e-5)
Numerically compute gradient of scalar function.
Definition numericalDerivative.h:133
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4, X5, X6 > >::dimension, N >::type numericalDerivative61(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, const X5 &x5, const X6 &x6, double delta=1e-5)
Compute numerical derivative in argument 1 of 6-argument function.
Definition numericalDerivative.h:687
internal::MatrixMN< N3, N3 >::type numericalHessian333(F &&f, const X1 &x1, const X2 &x2, const X3 &x3, double delta=1e-5)
Hessian with respect to argument 3 of a ternary scalar function.
Definition numericalDerivative.h:1052
internal::MatrixMN< N2, N2 >::type numericalHessian222(F &&f, const X1 &x1, const X2 &x2, double delta=1e-5)
Hessian with respect to argument 2 of a binary scalar function.
Definition numericalDerivative.h:968
internal::MatrixMN< N1, N1 >::type numericalHessian311(F &&f, const X1 &x1, const X2 &x2, const X3 &x3, double delta=1e-5)
Numerical Hessian for ternary functions.
Definition numericalDerivative.h:996
internal::MatrixMN< N, N >::type numericalHessian(F &&f, const X &x, double delta=1e-5)
Compute numerical Hessian matrix.
Definition numericalDerivative.h:901
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4, X5, X6 > >::dimension, N >::type numericalDerivative62(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, const X5 &x5, const X6 &x6, double delta=1e-5)
Compute numerical derivative in argument 2 of 6-argument function.
Definition numericalDerivative.h:723
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4 > >::dimension, N >::type numericalDerivative42(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, double delta=1e-5)
Compute numerical derivative in argument 2 of 4-argument function.
Definition numericalDerivative.h:417
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2 > >::dimension, N >::type numericalDerivative22(F &&h, const X1 &x1, const X2 &x2, double delta=1e-5)
Compute numerical derivative in argument 2 of binary function.
Definition numericalDerivative.h:265
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4, X5, X6 > >::dimension, N >::type numericalDerivative66(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, const X5 &x5, const X6 &x6, double delta=1e-5)
Compute numerical derivative in argument 6 of 6-argument function.
Definition numericalDerivative.h:867
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4, X5 > >::dimension, N >::type numericalDerivative55(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, const X5 &x5, double delta=1e-5)
Compute numerical derivative in argument 5 of 5-argument function.
Definition numericalDerivative.h:652
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3 > >::dimension, N >::type numericalDerivative32(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, double delta=1e-5)
Compute numerical derivative in argument 2 of ternary function.
Definition numericalDerivative.h:324
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4, X5, X6 > >::dimension, N >::type numericalDerivative63(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, const X5 &x5, const X6 &x6, double delta=1e-5)
Compute numerical derivative in argument 3 of 6-argument function.
Definition numericalDerivative.h:759
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4, X5 > >::dimension, N >::type numericalDerivative54(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, const X5 &x5, double delta=1e-5)
Compute numerical derivative in argument 4 of 5-argument function.
Definition numericalDerivative.h:618
internal::MatrixMN< N1, N3 >::type numericalHessian313(F &&f, const X1 &x1, const X2 &x2, const X3 &x3, double delta=1e-5)
Mixed Hessian with respect to arguments 1 and 3 of a ternary scalar function.
Definition numericalDerivative.h:1096
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4 > >::dimension, N >::type numericalDerivative43(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, double delta=1e-5)
Compute numerical derivative in argument 3 of 4-argument function.
Definition numericalDerivative.h:450
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4 > >::dimension, N >::type numericalDerivative44(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, double delta=1e-5)
Compute numerical derivative in argument 4 of 4-argument function.
Definition numericalDerivative.h:483
internal::MatrixMN< traits< internal::OutputType< Y, F, X > >::dimension, N >::type numericalDerivative11(F &&h, const X &x, double delta=1e-5)
New-style numerical derivatives using manifold_traits.
Definition numericalDerivative.h:180
internal::MatrixMN< N1, N1 >::type numericalHessian211(F &&f, const X1 &x1, const X2 &x2, double delta=1e-5)
Hessian with respect to argument 1 of a binary scalar function.
Definition numericalDerivative.h:944
internal::MatrixMN< N1, N2 >::type numericalHessian212(F &&f, const X1 &x1, const X2 &x2, double delta=1e-5)
Mixed Hessian with respect to argument 1 then argument 2.
Definition numericalDerivative.h:920
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3 > >::dimension, N >::type numericalDerivative33(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, double delta=1e-5)
Compute numerical derivative in argument 3 of ternary function.
Definition numericalDerivative.h:354
internal::MatrixMN< N2, N2 >::type numericalHessian322(F &&f, const X1 &x1, const X2 &x2, const X3 &x3, double delta=1e-5)
Hessian with respect to argument 2 of a ternary scalar function.
Definition numericalDerivative.h:1024
internal::MatrixMN< traits< internal::OutputType< Y, F, X1, X2, X3, X4 > >::dimension, N >::type numericalDerivative41(F &&h, const X1 &x1, const X2 &x2, const X3 &x3, const X4 &x4, double delta=1e-5)
Compute numerical derivative in argument 1 of 4-argument function.
Definition numericalDerivative.h:384
Global functions in a separate testing namespace.
Definition chartTesting.h:28
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition Group.h:37
tag to assert a type is a manifold
Definition Manifold.h:33
Select the fixed-size Jacobian type associated with two manifold types.
Definition numericalDerivative.h:59
Select a fixed-size matrix from explicit row and column counts.
Definition numericalDerivative.h:66
Marker type used when the callable return type should be deduced.
Definition numericalDerivative.h:71