import sys
import csv
import hmm
import bayes_net
from collections import OrderedDict
import song_collections


models = [("Bayes Net", bayes_net.score)] + [("{0} Order HMM".format(i), hmm.get_scorer(i)) for i in range(2, 7)]
models = OrderedDict(models)

writer = csv.writer(sys.stdout)

header_row = ["File", "Type"]

for label, model in models.items():
    header_row.append(label)
    header_row.append(r"% diff from random")

writer.writerow(header_row)

random_model_values = []
for i in range(len(models)):
    random_model_values.append(list())

for song in song_collections.random_songs:
    row = [song, "random"]
    index = 0
    for model in models.values():
        value = model(song)
        random_model_values[index].append(value)
files_to_test = []
test_path = os.path.join("data", "Random Songs")
for root, dirs, files in os.walk(test_path):
	for name in [a_file for a_file in files if a_file[-4:] == ".mid"]:
		files_to_test.append(os.path.join(root,name))

log_path = "log"
model_scores = OrderedDict()

for hmm_depth in range(2,7):
	model_label = "HMM: %d Depth" % (hmm_depth,)
	print model_label

	cache = dict()
	model = hmm.get_scorer(hmm_depth, cache)
	scores_for_model = utils.score_files_with_model(files_to_test, model)
	num_scores = len(scores_for_model)
	total_scores = sum([score for score in scores_for_model.values() if score is not None])
	average_score = float(total_scores) / num_scores


	log_name = "HMM_" + str(hmm_depth) + "_random.txt"
	log_full_path = os.path.join(log_path, log_name);
	f = open(log_full_path, 'w')
	index = 1
	for score in scores_for_model.values():
		if score is not None:
			print >> f, "%d %f" % (index, score)
			index += 1
	f.close()