void DefaultCandidateSetScorer::Score(Model *model, CandidateSet &candidates, bool training) { // N.B.: We assume there is at least one candidate! CandidateSet::iterator it = candidates.begin(); // Score first candidate, which is perforce the best candidate so far. model->ScoreCandidate(*(*it), training); CandidateSet::iterator best_it = it; CandidateSet::iterator gold_it = it; ++it; // Score any and all remaining candidates. for ( ; it != candidates.end(); ++it) { Candidate &candidate = *(*it); model->ScoreCandidate(candidate, training); if (model->score_comparator()->Compare(*model, candidate, **best_it) > 0) { best_it = it; } if (model->gold_comparator()->Compare(*model, candidate, **gold_it) > 0) { gold_it = it; } } candidates.set_best_scoring_index((*best_it)->index()); candidates.set_gold_index((*gold_it)->index()); }
void RandomPairCandidateSetScorer::Score(Model *model, CandidateSet &candidates, bool training) { // First, pick two candidate indices at random. size_t idx1 = GetRandomIndex(candidates.size()); size_t idx2 = GetRandomIndex(candidates.size()); Candidate &c1 = candidates.Get(idx1); Candidate &c2 = candidates.Get(idx2); // Next, just score those two candidates. model->ScoreCandidate(c1, training); model->ScoreCandidate(c2, training); // Finally, set indices of best scoring and gold amongst just those two. int score_cmp = model->score_comparator()->Compare(*model, c1, c2); candidates.set_best_scoring_index(score_cmp > 0 ? c1.index() : c2.index()); int gold_cmp = model->gold_comparator()->Compare(*model, c1, c2); candidates.set_gold_index(gold_cmp > 0 ? c1.index() : c2.index()); }