':param src_sentence: Sentence to be translated
:type src_sentence: list(str)
:return: Translated sentence
:rtype: list(str)'

def translate(self, src_sentence):

    sentence = tuple(src_sentence)
    sentence_length = len(sentence)
    stacks = [_Stack(self.stack_size, self.beam_threshold) for _ in range(0, (sentence_length + 1))]
    empty_hypothesis = _Hypothesis()
    stacks[0].push(empty_hypothesis)
    all_phrases = self.find_all_src_phrases(sentence)
    future_score_table = self.compute_future_scores(sentence)
    for stack in stacks:
        for hypothesis in stack:
            possible_expansions = StackDecoder.valid_phrases(all_phrases, hypothesis)
            for src_phrase_span in possible_expansions:
                src_phrase = sentence[src_phrase_span[0]:src_phrase_span[1]]
                for translation_option in self.phrase_table.translations_for(src_phrase):
                    raw_score = self.expansion_score(hypothesis, translation_option, src_phrase_span)
                    new_hypothesis = _Hypothesis(raw_score=raw_score, src_phrase_span=src_phrase_span, trg_phrase=translation_option.trg_phrase, previous=hypothesis)
                    new_hypothesis.future_score = self.future_score(new_hypothesis, future_score_table, sentence_length)
                    total_words = new_hypothesis.total_translated_words()
                    stacks[total_words].push(new_hypothesis)
    if (not stacks[sentence_length]):
        warnings.warn('Unable    to    translate    all    words.    The    source    sentence    contains    words    not    in    the    phrase    table')
        return []
    best_hypothesis = stacks[sentence_length].best()
    return best_hypothesis.translation_so_far()
