void DependencyPipe::ComputeScores(Instance *instance, Parts *parts,
                                   Features *features,
                                   bool pruner,
                                   vector<double> *scores) {
  Parameters *parameters;
  if (pruner) {
    parameters = pruner_parameters_;
  } else {
    parameters = parameters_;
  }
  scores->resize(parts->size());
  DependencyParts *dependency_parts = static_cast<DependencyParts*>(parts);
  for (int r = 0; r < parts->size(); ++r) {
    // Labeled arcs will be treated by looking at the unlabeled arcs and
    // conjoining with the label.
    if (pruner) CHECK_EQ((*parts)[r]->type(), DEPENDENCYPART_ARC);
    if ((*parts)[r]->type() == DEPENDENCYPART_LABELEDARC) continue;
    const BinaryFeatures &part_features = features->GetPartFeatures(r);
    if ((*parts)[r]->type() == DEPENDENCYPART_ARC && !pruner &&
        GetDependencyOptions()->labeled()) {
      (*scores)[r] = 0.0;
      DependencyPartArc *arc = static_cast<DependencyPartArc*>((*parts)[r]);
      const vector<int> &index_labeled_parts =
          dependency_parts->FindLabeledArcs(arc->head(), arc->modifier());
      vector<int> allowed_labels(index_labeled_parts.size());
      for (int k = 0; k < index_labeled_parts.size(); ++k) {
        DependencyPartLabeledArc *labeled_arc =
            static_cast<DependencyPartLabeledArc*>(
                (*parts)[index_labeled_parts[k]]);
        allowed_labels[k] = labeled_arc->label();
      }
      vector<double> label_scores;
      parameters->ComputeLabelScores(part_features, allowed_labels,
          &label_scores);
      for (int k = 0; k < index_labeled_parts.size(); ++k) {
        (*scores)[index_labeled_parts[k]] = label_scores[k];
      }
      continue;
    }
    (*scores)[r] = parameters->ComputeScore(part_features);
  }
}