/* * Copyright 1999-2002 Carnegie Mellon University. * Portions Copyright 2002 Sun Microsystems, Inc. * Portions Copyright 2002 Mitsubishi Electric Research Laboratories. * All Rights Reserved. Use is subject to license terms. * * See the file "license.terms" for information on usage and * redistribution of this file, and for a DISCLAIMER OF ALL * WARRANTIES. * */ package edu.cmu.sphinx.decoder.search; import edu.cmu.sphinx.decoder.scorer.Scoreable; import java.util.*; /** * Manager for pruned hypothesis * * @author Joe Woelfel */ public class AlternateHypothesisManager { private final Map<Token, List<Token>> viterbiLoserMap = new HashMap<Token, List<Token>>(); private final int maxEdges; /** * Creates an alternate hypotheses manager * * @param maxEdges the maximum edges allowed */ public AlternateHypothesisManager(int maxEdges) { this.maxEdges = maxEdges; } /** * Collects adds alternate predecessors for a token that would have lost because of viterbi. * * @param token - a token that has an alternate lower scoring predecessor that still might be of interest * @param predecessor - a predecessor that scores lower than token.getPredecessor(). */ public void addAlternatePredecessor(Token token, Token predecessor) { assert predecessor != token.getPredecessor(); List<Token> list = viterbiLoserMap.get(token); if (list == null) { list = new ArrayList<Token>(); viterbiLoserMap.put(token, list); } list.add(predecessor); } /** * Returns a list of alternate predecessors for a token. * * @param token - a token that may have alternate lower scoring predecessor that still might be of interest * @return A list of predecessors that scores lower than token.getPredecessor(). */ public List<Token> getAlternatePredecessors(Token token) { return viterbiLoserMap.get(token); } /** Purge all but max number of alternate preceding token hypotheses. */ public void purge() { int max = maxEdges - 1; for (Map.Entry<Token, List<Token>> entry : viterbiLoserMap.entrySet()) { List<Token> list = entry.getValue(); Collections.sort(list, Scoreable.COMPARATOR); List<Token> newList = list.subList(0, list.size() > max ? max : list.size()); viterbiLoserMap.put(entry.getKey(), newList); } } public boolean hasAlternatePredecessors(Token token) { return viterbiLoserMap.containsKey(token); } }