#pragma once #include #include #include #include namespace basalt { template class LinearizationBase { public: using Scalar = Scalar_; static constexpr int POSE_SIZE = POSE_SIZE_; using VecX = Eigen::Matrix; using MatX = Eigen::Matrix; struct Options { typename LandmarkBlock::Options lb_options; LinearizationType linearization_type; }; virtual ~LinearizationBase() = default; virtual void log_problem_stats(ExecutionStats& stats) const = 0; virtual Scalar linearizeProblem(bool* numerically_valid = nullptr) = 0; virtual void performQR() = 0; // virtual void setPoseDamping(const Scalar lambda) = 0; // virtual bool hasPoseDamping() const = 0; virtual Scalar backSubstitute(const VecX& pose_inc) = 0; // virtual VecX getJp_diag2() const = 0; // virtual void scaleJl_cols() = 0; // virtual void scaleJp_cols(const VecX& jacobian_scaling) = 0; // virtual void setLandmarkDamping(Scalar lambda) = 0; virtual void get_dense_Q2Jp_Q2r(MatX& Q2Jp, VecX& Q2r) const = 0; virtual void get_dense_H_b(MatX& H, VecX& b) const = 0; static std::unique_ptr create( BundleAdjustmentBase* estimator, const AbsOrderMap& aom, const Options& options, const MargLinData* marg_lin_data = nullptr, const ImuLinData* imu_lin_data = nullptr, const std::set* used_frames = nullptr, const std::unordered_set* lost_landmarks = nullptr, int64_t last_state_to_marg = std::numeric_limits::max()); }; bool isLinearizationSqrt(const LinearizationType& type); } // namespace basalt