123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411 |
- #ifndef CERES_PUBLIC_MANIFOLD_H_
- #define CERES_PUBLIC_MANIFOLD_H_
- #include <Eigen/Core>
- #include <algorithm>
- #include <array>
- #include <memory>
- #include <utility>
- #include <vector>
- #include "ceres/internal/disable_warnings.h"
- #include "ceres/internal/export.h"
- #include "ceres/types.h"
- #include "glog/logging.h"
- namespace ceres {
- class CERES_EXPORT Manifold {
- public:
- virtual ~Manifold();
-
- virtual int AmbientSize() const = 0;
-
- virtual int TangentSize() const = 0;
-
-
-
-
-
-
-
-
-
-
- virtual bool Plus(const double* x,
- const double* delta,
- double* x_plus_delta) const = 0;
-
-
-
-
-
-
-
- virtual bool PlusJacobian(const double* x, double* jacobian) const = 0;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- virtual bool RightMultiplyByPlusJacobian(const double* x,
- const int num_rows,
- const double* ambient_matrix,
- double* tangent_matrix) const;
-
-
-
-
-
-
-
-
-
- virtual bool Minus(const double* y,
- const double* x,
- double* y_minus_x) const = 0;
-
-
-
-
-
-
-
- virtual bool MinusJacobian(const double* x, double* jacobian) const = 0;
- };
- template <int Size>
- class EuclideanManifold final : public Manifold {
- public:
- static_assert(Size == ceres::DYNAMIC || Size >= 0,
- "The size of the manifold needs to be non-negative.");
- static_assert(ceres::DYNAMIC == Eigen::Dynamic,
- "ceres::DYNAMIC needs to be the same as Eigen::Dynamic.");
- EuclideanManifold() : size_{Size} {
- static_assert(
- Size != ceres::DYNAMIC,
- "The size is set to dynamic. Please call the constructor with a size.");
- }
- explicit EuclideanManifold(int size) : size_(size) {
- if (Size != ceres::DYNAMIC) {
- CHECK_EQ(Size, size)
- << "Specified size by template parameter differs from the supplied "
- "one.";
- } else {
- CHECK_GE(size_, 0)
- << "The size of the manifold needs to be non-negative.";
- }
- }
- int AmbientSize() const override { return size_; }
- int TangentSize() const override { return size_; }
- bool Plus(const double* x_ptr,
- const double* delta_ptr,
- double* x_plus_delta_ptr) const override {
- Eigen::Map<const AmbientVector> x(x_ptr, size_);
- Eigen::Map<const AmbientVector> delta(delta_ptr, size_);
- Eigen::Map<AmbientVector> x_plus_delta(x_plus_delta_ptr, size_);
- x_plus_delta = x + delta;
- return true;
- }
- bool PlusJacobian(const double* x_ptr, double* jacobian_ptr) const override {
- Eigen::Map<MatrixJacobian> jacobian(jacobian_ptr, size_, size_);
- jacobian.setIdentity();
- return true;
- }
- bool RightMultiplyByPlusJacobian(const double* x,
- const int num_rows,
- const double* ambient_matrix,
- double* tangent_matrix) const override {
- std::copy_n(ambient_matrix, num_rows * size_, tangent_matrix);
- return true;
- }
- bool Minus(const double* y_ptr,
- const double* x_ptr,
- double* y_minus_x_ptr) const override {
- Eigen::Map<const AmbientVector> x(x_ptr, size_);
- Eigen::Map<const AmbientVector> y(y_ptr, size_);
- Eigen::Map<AmbientVector> y_minus_x(y_minus_x_ptr, size_);
- y_minus_x = y - x;
- return true;
- }
- bool MinusJacobian(const double* x_ptr, double* jacobian_ptr) const override {
- Eigen::Map<MatrixJacobian> jacobian(jacobian_ptr, size_, size_);
- jacobian.setIdentity();
- return true;
- }
- private:
- static constexpr bool IsDynamic = (Size == ceres::DYNAMIC);
- using AmbientVector = Eigen::Matrix<double, Size, 1>;
- using MatrixJacobian = Eigen::Matrix<double, Size, Size, Eigen::RowMajor>;
- int size_{};
- };
- class CERES_EXPORT SubsetManifold final : public Manifold {
- public:
- SubsetManifold(int size, const std::vector<int>& constant_parameters);
- int AmbientSize() const override;
- int TangentSize() const override;
- bool Plus(const double* x,
- const double* delta,
- double* x_plus_delta) const override;
- bool PlusJacobian(const double* x, double* jacobian) const override;
- bool RightMultiplyByPlusJacobian(const double* x,
- const int num_rows,
- const double* ambient_matrix,
- double* tangent_matrix) const override;
- bool Minus(const double* y,
- const double* x,
- double* y_minus_x) const override;
- bool MinusJacobian(const double* x, double* jacobian) const override;
- private:
- const int tangent_size_ = 0;
- std::vector<bool> constancy_mask_;
- };
- class CERES_EXPORT QuaternionManifold final : public Manifold {
- public:
- int AmbientSize() const override { return 4; }
- int TangentSize() const override { return 3; }
- bool Plus(const double* x,
- const double* delta,
- double* x_plus_delta) const override;
- bool PlusJacobian(const double* x, double* jacobian) const override;
- bool Minus(const double* y,
- const double* x,
- double* y_minus_x) const override;
- bool MinusJacobian(const double* x, double* jacobian) const override;
- };
- class CERES_EXPORT EigenQuaternionManifold final : public Manifold {
- public:
- int AmbientSize() const override { return 4; }
- int TangentSize() const override { return 3; }
- bool Plus(const double* x,
- const double* delta,
- double* x_plus_delta) const override;
- bool PlusJacobian(const double* x, double* jacobian) const override;
- bool Minus(const double* y,
- const double* x,
- double* y_minus_x) const override;
- bool MinusJacobian(const double* x, double* jacobian) const override;
- };
- }
- #include "ceres/internal/reenable_warnings.h"
- #endif
|