| #include "ceres/internal/export.h" |
| #include "ceres/local_parameterization.h" |
| #include "ceres/manifold.h" |
| #include "glog/logging.h" |
| |
| namespace ceres::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 ceres::internal |