140#ifndef G2O_CERES_PUBLIC_INTERNAL_AUTODIFF_H_
141#define G2O_CERES_PUBLIC_INTERNAL_AUTODIFF_H_
159#ifndef G2O_CERES_AUTODIFF_MAX_PARAMETERS_ON_STACK
160#define G2O_CERES_AUTODIFF_MAX_PARAMETERS_ON_STACK 50
163#ifndef G2O_CERES_AUTODIFF_MAX_RESIDUALS_ON_STACK
164#define G2O_CERES_AUTODIFF_MAX_RESIDUALS_ON_STACK 20
185template <
int j,
int N,
int Offset,
typename T,
typename JetT>
188 inline static void Apply(
const T* src, JetT* dst) {
189 dst[j] = JetT(src[j], j + Offset);
194template <
int N,
int Offset,
typename T,
typename JetT>
197 static void Apply(
const T* , JetT* ) {}
209template <
typename Seq,
int ParameterIdx = 0,
int Offset = 0>
212template <
int N,
int... Ns,
int ParameterIdx,
int Offset>
214 ParameterIdx, Offset> {
215 template <
typename T,
typename JetT>
216 inline static void Apply(T
const*
const* parameters, JetT* x) {
218 parameters[ParameterIdx], x + Offset);
220 ParameterIdx + 1, Offset + N>::Apply(parameters,
226template <
int ParameterIdx,
int Total>
229 template <
typename T,
typename JetT>
230 static void Apply(T
const*
const* , JetT* ) {}
235template <
typename JetT,
typename T>
237 for (
int i = 0; i < M; ++i) {
244template <
int N0,
int N,
typename JetT,
typename T>
246 for (
int i = 0; i < M; ++i) {
247 Eigen::Map<Eigen::Matrix<T, N, 1>>(dst + N * i, N) =
248 src[i].v.template segment<N>(N0);
269template <
typename Seq,
int ParameterIdx = 0,
int Offset = 0>
272template <
int N,
int... Ns,
int ParameterIdx,
int Offset>
275 template <
typename JetT,
typename T>
276 inline static void Apply(
int num_outputs, JetT* output, T** jacobians) {
277 if (jacobians[ParameterIdx]) {
278 Take1stOrderPart<Offset, N>(num_outputs, output, jacobians[ParameterIdx]);
281 Offset + N>::Apply(num_outputs, output, jacobians);
286template <
int ParameterIdx,
int Offset>
288 template <
typename T,
typename JetT>
293template <
int kNumResiduals,
typename ParameterDims,
typename Functor,
296 T
const*
const* parameters,
297 int dynamic_num_outputs, T* function_value,
307 std::array<JetT*, ParameterDims::kNumParameterBlocks> unpacked_parameters =
314 const int num_outputs =
315 kNumResiduals ==
kDynamic ? dynamic_num_outputs : kNumResiduals;
318 residuals_as_jets(num_outputs);
322 for (
int i = 0; i < num_outputs; ++i) {
328 parameters_as_jets.data());
330 if (!VariadicEvaluate<ParameterDims>(functor, unpacked_parameters.data(),
331 residuals_as_jets.data())) {
#define G2O_CERES_AUTODIFF_MAX_PARAMETERS_ON_STACK
static constexpr int kNumParameters
std::integer_sequence< int, Ns... > Parameters
static std::array< T *, kNumParameterBlocks > GetUnpackedParameters(T *ptr)
void Take1stOrderPart(const int M, const JetT *src, T *dst)
bool AutoDifferentiate(const Functor &functor, T const *const *parameters, int dynamic_num_outputs, T *function_value, T **jacobians)
void Take0thOrderPart(int M, const JetT *src, T dst)
const double kImpossibleValue
static void Apply(const T *, JetT *)
static void Apply(const T *src, JetT *dst)
static void Apply(T const *const *parameters, JetT *x)
static void Apply(T const *const *, JetT *)
static void Apply(int num_outputs, JetT *output, T **jacobians)
static void Apply(int, JetT *, T **)