private void UpdateStateQueue(
      MinPriorityDecoderQueue<DecoderState> minPriorityDecoderQueue,
      DecoderState curState,
      DecoderState prevState,
      ScoredPhrasePairForSentence phrase,
      HashMap<DecoderState, BackPointerElement> backPointers) {
    BackPointerElement elem = backPointers.get(curState);

    if (elem == null || elem.getState().getScore() < curState.getScore()) {
      minPriorityDecoderQueue.insert(curState, curState.getScore());

      if (elem == null) {
        backPointers.put(curState, new BackPointerElement(prevState, phrase));
      } else {
        elem.setState(prevState);
        elem.setPhrase(phrase);
      }
    }
  }
  private void initializeStateQueues(
      List<MinPriorityDecoderQueue<DecoderState>> decoderStateQueues, int sentenceLength) {
    DecoderState startState = getStartState(sentenceLength);

    for (int i = 0; i <= sentenceLength; ++i) {
      MinPriorityDecoderQueue<DecoderState> queue =
          new MinPriorityDecoderQueue<DecoderState>(BeamSizeForStatesQueue);
      decoderStateQueues.add(queue);
    }

    decoderStateQueues.get(0).insert(startState, startState.getScore());
  }