Beispiel #1
0
void SortedCopy(const SparseVector& in_vec, SparseVector* out_vec){

  // START: Disable after debug!!
  // Make sure there are no duplicate indices in input
  {
    std::set<uint64> prev_indices;
    for (int i=0; i < in_vec.indices_size(); ++i){
      uint64 cur_index = in_vec.indices(i);
      CHECK(!scul::Contains(prev_indices, cur_index)) << "cur_index: " << cur_index;
      prev_indices.insert(cur_index);
    }
  }
  // END

  CHECK(out_vec);
  out_vec->Clear();
  scul::Permutation p;
  p.InitSortingPermutation(in_vec.indices());
  CHECK_EQ(p.size(), in_vec.indices_size());

  ResizeRepeatedField(out_vec->mutable_indices(), p.size());
  ResizeRepeatedField(out_vec->mutable_values(), p.size());

  p.Apply(in_vec.indices(), out_vec->mutable_indices());
  p.Apply(in_vec.values(), out_vec->mutable_values());

  // START: Disable after debug!!
  // Make sure there are no duplicate indicies
  {
    uint64 prev_index = 0;
    for (int i=0; i < out_vec->indices_size(); ++i){
      uint64 cur_index = out_vec->indices(i);
      if (i){
        CHECK_GT(cur_index, prev_index) << "i: " << i << " size: " << out_vec->indices_size();
      }
      prev_index = cur_index;
    }
  }
  // END
}