mirror of
https://github.com/ceres-solver/ceres-solver.git
synced 2026-08-29 16:40:38 +08:00
6dd18563a1
Changed DynamicAutoDiffCostFunction to handle multiple derivative sections as opposed to just a single contiguous block. In the previous implementation it was assumed that non-constant parameters occur in a single contiguous block so that constant parameters could NOT lie between non-constant parameters. Previously, start_derivative_section was first set as soon as the first non-constant parameter block (marked by jacobians[i] != NULL) was encountered. After this, entries in input_jets[parameter_cursor].v were accessed with `parameter_cursor - start_derivative_section`. For contiguous non-constant parameter blocks this is fine, but if constant parameter blocks fall between then this indexing is incorrect because `parameter_cursor - start_derivative_section` can go out of bounds. For a concrete example, take a cost function with three parameter blocks, each of size 1 and with the center block fixed. Assume that Stride=1 so that two passes are required. On the first pass start_derivative_section=0, and the first variable block is handled correctly. At the end of the first pass end_derivative_section=1, so for the second pass start_derivative_section=1. Now comes the problem. When parameter_cursor=1, parameter_cursor >= start_derivative_section so jacobian[1] is checked to be NULL. Since it is NULL (second parameter block is constant) then nothing is done and active_parameter_count is NOT incremented. Next, when parameter_cursor=2, parameter_cursor >= start_derivative_section and jacobian[2] is checked. Since it is not NULL then input_jets[parameter_cursor].v[parameter_cursor - start_derivative_section] is set to 1.0, BUT parameter_cursor - start_derivative_section = 2 - 1 = 1 which is out of bounds (input_jets[parameter_cursor].v is only of size Stride=1). The proposed solution records the start of each contiguous block of non-constant parameters and indexing into input_jets[parameter_cursor].v is independent of parameter_cursor. Change-Id: I388ab6a0bafa35d317491135ec6fe980453ff888