void TapenadeHand::calculate_jacobian_complicated()

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;
}