void DependencyPipe::RemoveUnsupportedFeatures(Instance *instance, Parts *parts,
                                               bool pruner,
                                               const vector<bool> &selected_parts,
                                               Features *features) {
  Parameters *parameters;
  if (pruner) {
    parameters = pruner_parameters_;
  } else {
    parameters = parameters_;
  }

  for (int r = 0; r < parts->size(); ++r) {
    if (!selected_parts[r]) continue;
    if (pruner) CHECK_EQ((*parts)[r]->type(), DEPENDENCYPART_ARC);
    // Skip labeled arcs, are they use the features from unlabeled arcs.
    if ((*parts)[r]->type() == DEPENDENCYPART_LABELEDARC) continue;
    BinaryFeatures *part_features =
      static_cast<DependencyFeatures*>(features)->GetMutablePartFeatures(r);
    int num_supported = 0;
    for (int j = 0; j < part_features->size(); ++j) {
      if (parameters->Exists((*part_features)[j])) {
        (*part_features)[num_supported] = (*part_features)[j];
        ++num_supported;
      }
    }
    part_features->resize(num_supported);
  }
}