123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- #ifndef CERES_PUBLIC_AUTODIFF_COST_FUNCTION_H_
- #define CERES_PUBLIC_AUTODIFF_COST_FUNCTION_H_
- #include <memory>
- #include "ceres/internal/autodiff.h"
- #include "ceres/sized_cost_function.h"
- #include "ceres/types.h"
- #include "glog/logging.h"
- namespace ceres {
- template <typename CostFunctor,
- int kNumResiduals,
- int... Ns>
- class AutoDiffCostFunction final
- : public SizedCostFunction<kNumResiduals, Ns...> {
- public:
-
-
- explicit AutoDiffCostFunction(CostFunctor* functor,
- Ownership ownership = TAKE_OWNERSHIP)
- : functor_(functor), ownership_(ownership) {
- static_assert(kNumResiduals != DYNAMIC,
- "Can't run the fixed-size constructor if the number of "
- "residuals is set to ceres::DYNAMIC.");
- }
-
-
-
-
-
- AutoDiffCostFunction(CostFunctor* functor,
- int num_residuals,
- Ownership ownership = TAKE_OWNERSHIP)
- : functor_(functor), ownership_(ownership) {
- static_assert(kNumResiduals == DYNAMIC,
- "Can't run the dynamic-size constructor if the number of "
- "residuals is not ceres::DYNAMIC.");
- SizedCostFunction<kNumResiduals, Ns...>::set_num_residuals(num_residuals);
- }
- AutoDiffCostFunction(AutoDiffCostFunction&& other)
- : functor_(std::move(other.functor_)), ownership_(other.ownership_) {}
- virtual ~AutoDiffCostFunction() {
-
-
-
-
-
- if (ownership_ == DO_NOT_TAKE_OWNERSHIP) {
- functor_.release();
- }
- }
-
-
-
-
-
- bool Evaluate(double const* const* parameters,
- double* residuals,
- double** jacobians) const override {
- using ParameterDims =
- typename SizedCostFunction<kNumResiduals, Ns...>::ParameterDims;
- if (!jacobians) {
- return internal::VariadicEvaluate<ParameterDims>(
- *functor_, parameters, residuals);
- }
- return internal::AutoDifferentiate<kNumResiduals, ParameterDims>(
- *functor_,
- parameters,
- SizedCostFunction<kNumResiduals, Ns...>::num_residuals(),
- residuals,
- jacobians);
- };
- const CostFunctor& functor() const { return *functor_; }
- private:
- std::unique_ptr<CostFunctor> functor_;
- Ownership ownership_;
- };
- }
- #endif
|