blob: af4c712ab948cdb777dfb8f54a77701bc750c626 [file] [log] [blame]
#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 {
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();
const LocalParameterization* local_parameterization_;
} // namespace ceres::internal