| #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 |