21#include <gtsam/config.h>
39template<
int Rows,
int Cols>
40class OptionalJacobian {
46 typedef Eigen::Matrix<double, Rows, Cols>
Jacobian;
47 typedef Eigen::Stride<Eigen::Dynamic, 1> Stride;
48 typedef Eigen::Map<Jacobian, 0, Stride> Map;
56 void usurp(
double* data, Eigen::Index outerStride) {
57 new (&map_) Map(data, Stride(outerStride, 1));
62 : map_(nullptr, Stride(1, 1)) {
63 if (data) usurp(data, outerStride);
66 template<
int M,
int N>
79 map_(nullptr, Stride(1, 1)) {
84 map_(nullptr, Stride(1, 1)) {
85 usurp(fixed.data(), fixed.rows());
90 map_(nullptr, Stride(1, 1)) {
92 usurp(fixedPtr->data(), fixedPtr->rows());
97 map_(nullptr, Stride(1, 1)) {
98 dynamic.resize(Rows, Cols);
99 usurp(dynamic.data(), dynamic.rows());
104 map_(nullptr, Stride(1, 1)) {
106 dynamic->resize(Rows, Cols);
107 usurp(dynamic->data(), dynamic->rows());
115 template<
class MATRIX>
117 map_(nullptr, Stride(1, 1)) {
118 if (dynamic_ref.rows() == Rows && dynamic_ref.cols() == Cols &&
119 !dynamic_ref.IsRowMajor && dynamic_ref.innerStride() == 1) {
120 usurp(dynamic_ref.data(), dynamic_ref.outerStride());
122 throw std::invalid_argument(
123 std::string(
"OptionalJacobian called with wrong dimensions or "
126 "(" + std::to_string(Rows) +
", " + std::to_string(Cols) +
")");
132 map_(nullptr, Stride(1, 1)) {
137 map_(nullptr, Stride(1, 1)) {
139 optional->get().resize(Rows, Cols);
140 usurp(optional->get().data(), optional->get().rows());
149 operator bool()
const {
150 return map_.data() !=
nullptr;
177 OptionalJacobian<Rows, N>
cols(
int startCol) {
226 if (optional) pointer_ = &((*optional).get());
230 operator bool()
const {
231 return pointer_!=
nullptr;
244template <
typename T>
struct traits;
251template <
class T,
class A>
262template<
class T,
class A>
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
OptionalJacobian is an Eigen::Ref like class that can take be constructed using either a fixed size o...
Definition OptionalJacobian.h:40
OptionalJacobian(Eigen::MatrixXd &dynamic)
Constructor that will resize a dynamic matrix (unless already correct).
Definition OptionalJacobian.h:96
OptionalJacobian()
Default constructor.
Definition OptionalJacobian.h:72
OptionalJacobian(Jacobian &fixed)
Constructor that will usurp data of a fixed-size matrix.
Definition OptionalJacobian.h:83
Map & operator*()
De-reference, like boost optional.
Definition OptionalJacobian.h:154
OptionalJacobian(std::nullptr_t)
Default constructor with nullptr_t To guide the compiler when nullptr is passed to args of the type O...
Definition OptionalJacobian.h:78
OptionalJacobian(Eigen::Ref< MATRIX > dynamic_ref)
Constructor from an Eigen::Ref value.
Definition OptionalJacobian.h:116
OptionalJacobian(Eigen::MatrixXd *dynamic)
Constructor that will resize a dynamic matrix (unless already correct).
Definition OptionalJacobian.h:103
OptionalJacobian(const std::optional< std::reference_wrapper< Eigen::MatrixXd > > optional)
Constructor compatible with old-style derivatives.
Definition OptionalJacobian.h:136
Eigen::Matrix< double, Rows, Cols > Jacobian
Definition OptionalJacobian.h:46
OptionalJacobian(Jacobian *fixedPtr)
Constructor that will usurp data of a fixed-size matrix, pointer version.
Definition OptionalJacobian.h:89
Map * operator->()
operator->()
Definition OptionalJacobian.h:159
OptionalJacobian(std::nullopt_t)
Constructor with std::nullopt just makes empty.
Definition OptionalJacobian.h:131
OptionalJacobian< Rows, N > cols(int startCol)
Access M*N sub-block if we are allocated, otherwise none TODO(frank): this could work as is below if ...
Definition OptionalJacobian.h:177
OptionalJacobian()
View on constructor argument, if given.
Definition OptionalJacobian.h:208
Eigen::MatrixXd Jacobian
Jacobian size type.
Definition OptionalJacobian.h:199
OptionalJacobian(std::nullopt_t)
Constructor with std::nullopt just makes empty.
Definition OptionalJacobian.h:219
OptionalJacobian(const std::optional< std::reference_wrapper< Eigen::MatrixXd > > optional)
Constructor for optional matrix reference.
Definition OptionalJacobian.h:224
Jacobian & operator*()
De-reference, like boost optional.
Definition OptionalJacobian.h:235
OptionalJacobian(Jacobian *pointer)
Construct from pointer to dynamic matrix.
Definition OptionalJacobian.h:213
OptionalJacobian(Jacobian &dynamic)
Construct from refrence to dynamic matrix.
Definition OptionalJacobian.h:216
Jacobian * operator->()
TODO: operator->().
Definition OptionalJacobian.h:240
: meta-function to generate Jacobian
Definition OptionalJacobian.h:252
: meta-function to generate JacobianTA optional reference Used mainly by Expressions
Definition OptionalJacobian.h:263