in tools/ADOLC/main.cpp [690:760]
void get_hand_nnz_pattern(const HandDataType& data,
vector<unsigned int> *pridxs,
vector<unsigned int> *pcidxs,
vector<double> *pnzvals)
{
auto& ridxs = *pridxs;
auto& cidxs = *pcidxs;
int n_pts = (int)data.points.cols();
int nnz_estimate = 3 * n_pts*(3 + 1 + 4);
ridxs.reserve(nnz_estimate); cidxs.reserve(nnz_estimate);
for (int i = 0; i < 3*n_pts; i++)
{
for (int j = 0; j < 3; j++)
{
ridxs.push_back(i);
cidxs.push_back(j);
}
ridxs.push_back(i);
cidxs.push_back(3 + (i % 3));
}
int col_off = 6;
const auto& parents = data.model.parents;
for (int i_pt = 0; i_pt < n_pts; i_pt++)
{
int i_vert = data.correspondences[i_pt];
vector<bool> bones(data.model.bone_names.size(), false);
for (size_t i_bone = 0; i_bone < bones.size(); i_bone++)
{
bones[i_bone] = bones[i_bone] | (data.model.weights(i_bone, i_vert) != 0);
}
for (int i_bone = (int)parents.size()-1; i_bone >= 0; i_bone--)
{
if(parents[i_bone] >= 0)
bones[parents[i_bone]] = bones[i_bone] | bones[parents[i_bone]];
}
int i_col = col_off;
for (int i_finger = 0; i_finger < 5; i_finger++)
{
for (int i_finger_bone = 1; i_finger_bone < 4; i_finger_bone++)
{
int i_bone = 1 + i_finger * 4 + i_finger_bone;
if (bones[i_bone])
{
for (int i_coord = 0; i_coord < 3; i_coord++)
{
ridxs.push_back(i_pt*3 + i_coord);
cidxs.push_back(i_col);
}
}
i_col++;
if (i_finger_bone == 1)
{
if (bones[i_bone])
{
for (int i_coord = 0; i_coord < 3; i_coord++)
{
ridxs.push_back(i_pt * 3 + i_coord);
cidxs.push_back(i_col);
}
}
i_col++;
}
}
}
}
pnzvals->resize(cidxs.size());
}