import random, sys, os, string
import gnoetics
import susanne

###
### Load all sentences from the Susanne Corpus
###

N = 6
model = gnoetics.seq_model_new(N)

sentences = susanne.get_all_sentences()

all_words = gnoetics.word_bag_new()
by_pos = {}
for sentence in sentences:
    pos_sentence = []
    for pos, word in sentence:
        if not by_pos.has_key(pos):
            by_pos[pos] = gnoetics.word_bag_new()
        word = gnoetics.dictionary_lookup(word)
        all_words.add(word)
        by_pos[pos].add(word)
        pos_sentence.append(pos)
    model.add_sentence(pos_sentence)

def start_state():
    return (None, ) * (N-1) + ("?",)

def evolve_state(vec, x):
    return vec[1:-1] + (x, "?")

def solve(vec, meter, allow_zero=1):

    options = model.solve(vec)
    if not options:
        return None
    
    random.shuffle(options)

    min_syl = 1
    if allow_zero:
        min_syl = 0

    max_syl = len(meter)

    seen = {}
    for pos in options:
        if pos is None:
            return (None, None)

        if not seen.has_key(pos):
            seen[pos] = 1
            word = by_pos[pos].pick_by_meter_left(min_syl, max_syl, meter)
            if word:
                return (pos, word)

    return None


def ramble():

    meter = "u-" * 5
    curr_meter = meter

    vec = start_state()

    lines = 0
    
    while 1:

        soln = solve(vec, curr_meter, allow_zero=(meter != curr_meter))
        if soln is None:
            print "--- ouch! ---"
            return

        pos, word = soln
        if pos is None:
            vec = start_state()
        else:
            print word.get_word(),
            vec = evolve_state(vec, pos)
            curr_meter = curr_meter[word.get_syllables():]
            if not curr_meter:
                print
                curr_meter = meter
                lines += 1
                if lines == 4:
                    sys.exit(0)

while 1:
    ramble()
    print
    print "-" * 50
    print
