in src/cpp/modules/tapenade/TapenadeHand.cpp [155:246]
void TapenadeHand::calculate_jacobian_complicated()
{
int nrows = result.objective.size();
int shift = 2 * nrows;
// calculate theta jacobian part
for (int i = 0; i < theta_d.size(); i++)
{
if (i > 0)
{
theta_d[i - 1] = 0.0;
}
theta_d[i] = 1.0;
hand_objective_complicated_d(
input.theta.data(),
theta_d.data(),
input.us.data(),
us_d.data(),
objective_input->bone_count,
objective_input->bone_names,
objective_input->parents,
objective_input->base_relatives,
base_relativesd,
objective_input->inverse_base_absolutes,
inverse_base_absolutesd,
&objective_input->base_positions,
&base_positionsd,
&objective_input->weights,
objective_input->triangles,
objective_input->is_mirrored,
objective_input->corresp_count,
objective_input->correspondences,
&objective_input->points,
result.objective.data(),
result.jacobian.data() + shift + i * nrows
);
}
theta_d.back() = 0.0;
// calculate us jacobian part
for (int i = 0; i < us_d.size(); i++)
{
if (i > 0)
{
us_d[i - 1] = 0.0;
}
us_d[i] = 1.0;
hand_objective_complicated_d(
input.theta.data(),
theta_d.data(),
input.us.data(),
us_d.data(),
objective_input->bone_count,
objective_input->bone_names,
objective_input->parents,
objective_input->base_relatives,
base_relativesd,
objective_input->inverse_base_absolutes,
inverse_base_absolutesd,
&objective_input->base_positions,
&base_positionsd,
&objective_input->weights,
objective_input->triangles,
objective_input->is_mirrored,
objective_input->corresp_count,
objective_input->correspondences,
&objective_input->points,
result.objective.data(),
us_jacobian_column.data()
);
if (i % 2 == 0)
{
for (int j = 0; j < 3; j++)
{
result.jacobian[3 * (i / 2) + j] = us_jacobian_column[3 * (i / 2) + j];
}
}
else
{
for (int j = 0; j < 3; j++)
{
result.jacobian[nrows + 3 * ((i - 1) / 2) + j] = us_jacobian_column[3 * ((i - 1) / 2) + j];
}
}
}
us_d.back() = 0.0;
}