diff options
Diffstat (limited to 'extern/ceres/internal/ceres/manifold_adapter.h')
-rw-r--r-- | extern/ceres/internal/ceres/manifold_adapter.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/extern/ceres/internal/ceres/manifold_adapter.h b/extern/ceres/internal/ceres/manifold_adapter.h new file mode 100644 index 00000000000..9a21456a731 --- /dev/null +++ b/extern/ceres/internal/ceres/manifold_adapter.h @@ -0,0 +1,60 @@ +#include "ceres/internal/export.h" +#include "ceres/local_parameterization.h" +#include "ceres/manifold.h" +#include "glog/logging.h" + +namespace ceres { +namespace internal { + +// Adapter to wrap LocalParameterization and make them look like Manifolds. +// +// ManifoldAdapter NEVER takes ownership of local_parameterization. +class CERES_NO_EXPORT ManifoldAdapter final : public Manifold { + public: + explicit ManifoldAdapter(const LocalParameterization* local_parameterization) + : local_parameterization_(local_parameterization) { + CHECK(local_parameterization != nullptr); + } + + bool Plus(const double* x, + const double* delta, + double* x_plus_delta) const override { + return local_parameterization_->Plus(x, delta, x_plus_delta); + } + + bool PlusJacobian(const double* x, double* jacobian) const override { + return local_parameterization_->ComputeJacobian(x, jacobian); + } + + bool RightMultiplyByPlusJacobian(const double* x, + const int num_rows, + const double* ambient_matrix, + double* tangent_matrix) const override { + return local_parameterization_->MultiplyByJacobian( + x, num_rows, ambient_matrix, tangent_matrix); + } + + bool Minus(const double* y, const double* x, double* delta) const override { + LOG(FATAL) << "This should never be called."; + return false; + } + + bool MinusJacobian(const double* x, double* jacobian) const override { + LOG(FATAL) << "This should never be called."; + return false; + } + + int AmbientSize() const override { + return local_parameterization_->GlobalSize(); + } + + int TangentSize() const override { + return local_parameterization_->LocalSize(); + } + + private: + const LocalParameterization* local_parameterization_; +}; + +} // namespace internal +} // namespace ceres |