1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- namespace ceres::internal {
- std::unique_ptr<ScratchEvaluatePreparer[]> ScratchEvaluatePreparer::Create(
- const Program& program, unsigned num_threads) {
- auto preparers = std::make_unique<ScratchEvaluatePreparer[]>(num_threads);
- int max_derivatives_per_residual_block =
- program.MaxDerivativesPerResidualBlock();
- for (unsigned i = 0; i < num_threads; i++) {
- preparers[i].Init(max_derivatives_per_residual_block);
- }
- return preparers;
- }
- void ScratchEvaluatePreparer::Init(int max_derivatives_per_residual_block) {
- jacobian_scratch_ = std::make_unique<double[]>(
- static_cast<std::size_t>(max_derivatives_per_residual_block));
- }
- void ScratchEvaluatePreparer::Prepare(const ResidualBlock* residual_block,
- int ,
- SparseMatrix* ,
- double** jacobians) {
- double* jacobian_block_cursor = jacobian_scratch_.get();
- int num_residuals = residual_block->NumResiduals();
- int num_parameter_blocks = residual_block->NumParameterBlocks();
- for (int j = 0; j < num_parameter_blocks; ++j) {
- const ParameterBlock* parameter_block =
- residual_block->parameter_blocks()[j];
- if (parameter_block->IsConstant()) {
- jacobians[j] = nullptr;
- } else {
- jacobians[j] = jacobian_block_cursor;
- jacobian_block_cursor += num_residuals * parameter_block->TangentSize();
- }
- }
- }
- }
|