#!/usr/bin/env python

# gera_graficos - Gera os graficos do do trabalho #1 de PAA apartir
#		  de um arquivo de estatisricas
#
# 
#
# Copyright (C) 2003 Tiago Macambira <tmacam @at@ dcc .dot. ufmg .dot. br>
# 
# Codigo baseado parcialmente em "demo.py", do pacote python-gnuplot
# Copyright (C) 1999-2001 Michael Haggerty <mhagger@alum.mit.edu>
#
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.  This program is distributed in
# the hope that it will be useful, but WITHOUT ANY WARRANTY; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.  See the GNU General Public License for more
# details; it is available at <http://www.fsf.org/copyleft/gpl.html>,
# or by writing to the Free Software Foundation, Inc., 59 Temple Place
# - Suite 330, Boston, MA 02111-1307, USA.

"""gera_graficos.py -- Gera os .ps dos graficos do trabalho #1 de PAA

Esse programa depende do modulo Gnuplot do python e de todos os módulos
dos quais esse ultimo dependa.
"""

from Numeric import *
import Gnuplot, Gnuplot.funcutils





def parse_time_file(file):
	""" colocar as estatisticas de tempo num hash de hash de hash de vetor"""
	stat={}
	for line in file.readlines():
		tmp=[]
		(alg,n,k,t,tmp)=line.split()
		
		(tmp,n)=n.split("=")
		n=int(n)
		
		(tmp,k)=k.split("=")
		k=int(k)
		
		(tmp,t)=t.split("=")
		t=int(t)
		
		if stat.has_key(n):
			if stat[n].has_key(k):
				if stat[n][k].has_key(alg):
					stat[n][k][alg].append(t)
				else:
					stat[n][k][alg]=[]
			else:
				stat[n][k]={}
		else:
			stat[n]={}
	return stat


def parse_mv_cmp_file(file):
	""" colocar as estatisticas de tempo num hash de hash de hash de vetor"""
	stat={}
	for line in file.readlines():
		tmp=[]
		(alg,n,k,mv,cmp)=line.split()
		
		(tmp,n)=n.split("=")
		n=int(n)
		
		(tmp,k)=k.split("=")
		k=int(k)
		
		(tmp,mv)=mv.split("=")
		mv=int(mv)
		
		(tmp,cmp)=cmp.split("=")
		cmp=int(cmp)
		
		#print "%-22s\tn=%s\tk=%s\tmv=%i\tcmp=%i" %(alg,n,k,mv,cmp)

		
		if stat.has_key(n):
			if stat[n].has_key(k):
				if stat[n][k].has_key(alg):
					stat[n][k][alg]['cmp'].append(cmp)
					stat[n][k][alg]['mv'].append(mv)
				else:
					stat[n][k][alg]={'cmp':[],'mv':[]}
			else:
				stat[n][k]={}
		else:
			stat[n]={}
	return stat


def calc_avrg(items=[]):
	sum = 0 ;
	for t in items:
		sum = sum + int(t)
	avrg=sum/len(items);
	return avrg

def print_time_stats(stat={}):
	"""Imprime as estatisticas condensadas na no STDOUT"""
	n_values=stat.keys()
	n_values.sort()
	for n in n_values:
		k_values=stat[n].keys()
		k_values.sort()
		for k in k_values:
			algorithms=stat[n][k].keys()
			algorithms.sort()
			for alg in algorithms:
				avrg=calc_avrg(stat[n][k][alg])
				print "%-22s\tn=%s\tk=%s\tmedia=%i" %(alg,n,k,avrg)

def print_mv_cmp_stats(stat={}):
	"""Imprime as estatisticas condensadas na no STDOUT"""
	n_values=stat.keys()
	n_values.sort()
	for n in n_values:
		k_values=stat[n].keys()
		k_values.sort()
		for k in k_values:
			algorithms=stat[n][k].keys()
			algorithms.sort()
			for alg in algorithms:
				mv_avrg=calc_avrg(stat[n][k][alg]['mv']);
				cmp_avrg=calc_avrg(stat[n][k][alg]['cmp'])
				print "%-22s\tn=%s\tk=%s\tmv=%i\tcmp=%i" %(alg,n,k,mv_avrg,cmp_avrg)



def plot_time_stats(stat={},n=10,save_ps=None,interactive=0):
	"""Plota as estatísticas para um dado valor de n
	
	stat - hash de hash de ... com as estatisticas
	n - Geraremos as estatisticas para a ordenaçao e vetores de tamanho n
	save_ps - Pode dizer o nome do arquivo .ps que geraremos na saida. Por default nao gera
		.ps nenhum
	"""

	# Obtenção de dados comuns
	alg_times={}
	k_values=stat[n].keys()
	k_values.sort()

	# vamos recoler conjuntos  (k,tempo) para cada algoritmo.. ( argh!)
	for k in k_values:
		algorithms=stat[n][k].keys()
		algorithms.sort()
		for alg in algorithms:
			try:
				alg_times[alg].append([k,calc_avrg(stat[n][k][alg])])
			except KeyError:
				alg_times[alg]=[]
	
	# Preparando a lista de pontos pde cada algoritmo
	lines=[]
	for a in algorithms:
		lines.append(Gnuplot.Data(alg_times[a],
                     title=a))
		     
	# prepara o plotter
	g = Gnuplot.Gnuplot(debug=1)
	g.title('Tempo de Execução dos agoritmos para n=%i' % n )
	g.xlabel("valores de k [%i]"%len(k_values))
	g.ylabel("tempo em us")
	g('set data style linespoints') # give gnuplot an arbitrary command

	# Plota!
	g.plot(*lines)

	# da tempo para ver a janela?!
	if interactive:
		raw_input('Please press return to continue...\n')

	if save_ps is not None:
		g.hardcopy(save_ps, enhanced=1, color=1)
		print ('\n******** Saved plot to postscript file "%s" ********\n' % save_ps)
	


def plot_mv_stats(stat={},n=10,save_ps=None,interactive=0):
	"""Plota as estatísticas para um dado valor de n
	
	stat - hash de hash de ... com as estatisticas
	n - Geraremos as estatisticas para a ordenaçao e vetores de tamanho n
	save_ps - Pode dizer o nome do arquivo .ps que geraremos na saida. Por default nao gera
		.ps nenhum
	"""

	# Obtenção de dados comuns
	alg_moves={}
	k_values=stat[n].keys()
	k_values.sort()

	# vamos recolher conjuntos  (k,tempo) para cada algoritmo.. ( argh!)
	for k in k_values:
		algorithms=stat[n][k].keys()
		algorithms.sort()
		for alg in algorithms:
			try:
				alg_moves[alg].append([k,calc_avrg(stat[n][k][alg]['mv'])])
			except KeyError:
				alg_moves[alg]=[]
	
	# Preparando a lista de pontos pde cada algoritmo
	lines=[]
	for a in algorithms:
		lines.append(Gnuplot.Data(alg_moves[a],
                     title=a))
		     
	# prepara o plotter
	g = Gnuplot.Gnuplot(debug=1)
	g.title('Números médios de movimentações de registri dos agoritmos para n=%i' % n )
	g.xlabel("valores de k [%i]"%len(k_values))
	g.ylabel("tempo em us")
	g('set data style linespoints') # give gnuplot an arbitrary command

	# Plota!
	g.plot(*lines)

	# da tempo para ver a janela?!
	if interactive:
		raw_input('Please press return to continue...\n')

	if save_ps is not None:
		g.hardcopy(save_ps, enhanced=1, color=1)
		print ('\n******** Saved plot to postscript file "%s" ********\n' % save_ps)
	
    
def plot_cmp_stats(stat={},n=10,save_ps=None,interactive=0):
	"""Plota as estatísticas para um dado valor de n
	
	stat - hash de hash de ... com as estatisticas
	n - Geraremos as estatisticas para a ordenaçao e vetores de tamanho n
	save_ps - Pode dizer o nome do arquivo .ps que geraremos na saida. Por default nao gera
		.ps nenhum
	"""

	# Obtenção de dados comuns
	alg_cmps={}
	k_values=stat[n].keys()
	k_values.sort()

	# vamos recolher conjuntos  (k,tempo) para cada algoritmo.. ( argh!)
	for k in k_values:
		algorithms=stat[n][k].keys()
		algorithms.sort()
		for alg in algorithms:
			try:
				alg_cmps[alg].append([k,calc_avrg(stat[n][k][alg]['cmp'])])
			except KeyError:
				alg_cmps[alg]=[]
	
	# Preparando a lista de pontos pde cada algoritmo
	lines=[]
	for a in algorithms:
		lines.append(Gnuplot.Data(alg_cmps[a],
                     title=a))
		     
	# prepara o plotter
	g = Gnuplot.Gnuplot(debug=1)
	g.title('Número médio de comparações feitas pelos agoritmos para n=%i' % n )
	g.xlabel("valores de k [%i]"%len(k_values))
	g.ylabel("tempo em us")
	g('set data style linespoints') # give gnuplot an arbitrary command

	# Plota!
	g.plot(*lines)

	# da tempo para ver a janela?!
	if interactive:
		raw_input('Please press return to continue...\n')

	if save_ps is not None:
		g.hardcopy(save_ps, enhanced=1, color=1)
		print ('\n******** Saved plot to postscript file "%s" ********\n' % save_ps)




if __name__ == '__main__':
	#file=open('estatisticas.txt','r')
	#stat=parse_time_file(file)
	#print_time_stats(stat)
	file=open('mv_cmp_stats.txt','r')
	stat=parse_mv_cmp_file(file)
	print_mv_cmp_stats(stat)
	#raw_input('Please press return to continue...\n')

	# Gera os graficos de tempo para cada n
	n_values=stat.keys()
	n_values.sort()
	for n in n_values:
		plot_cmp_stats(stat,n,'cmp_graph_%07i.ps'%n,interactive=0)	
		plot_mv_stats(stat,n,'mv_graph_%07i.ps'%n,interactive=0)	
#		plot_time_stats(stat,n, 'time_graph_%07i.ps'%n)	

