1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #include "ceres/block_evaluate_preparer.h"
- #include <vector>
- #include "ceres/block_sparse_matrix.h"
- #include "ceres/casts.h"
- #include "ceres/parameter_block.h"
- #include "ceres/residual_block.h"
- #include "ceres/sparse_matrix.h"
- namespace ceres::internal {
- void BlockEvaluatePreparer::Init(int const* const* jacobian_layout,
- int max_derivatives_per_residual_block) {
- jacobian_layout_ = jacobian_layout;
- scratch_evaluate_preparer_.Init(max_derivatives_per_residual_block);
- }
- void BlockEvaluatePreparer::Prepare(const ResidualBlock* residual_block,
- int residual_block_index,
- SparseMatrix* jacobian,
- double** jacobians) {
-
- if (jacobian == nullptr) {
- scratch_evaluate_preparer_.Prepare(
- residual_block, residual_block_index, jacobian, jacobians);
- return;
- }
- double* jacobian_values =
- down_cast<BlockSparseMatrix*>(jacobian)->mutable_values();
- const int* jacobian_block_offset = jacobian_layout_[residual_block_index];
- const int num_parameter_blocks = residual_block->NumParameterBlocks();
- for (int j = 0; j < num_parameter_blocks; ++j) {
- if (!residual_block->parameter_blocks()[j]->IsConstant()) {
- jacobians[j] = jacobian_values + *jacobian_block_offset;
-
-
-
- jacobian_block_offset++;
- } else {
- jacobians[j] = nullptr;
- }
- }
- }
- }
|