void get_hand_nnz_pattern()

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