Newer
Older
# Classe utilisee pour faire des statistiques elementaires
# sur une sequence d'operations.
class Analyzer:
# Constructeur de la classe analyse
# Complexite en temps/espace, pire et meilleur cas : O(1)
def __init__(self):
self.cost = [];
self.cumulative_cost = [];
self.cumulative_square = 0.;
# Ajoute un cout, une valeur a l'analyse.
# Complexite en temps/espace, pire cas : O(size)
# Complexite en temps/espace, meilleur cas : O(1)
# Complexite amortie : O(1)
# @param x est la valeur que l'on souhaite ajouter a l'analyse.
def append(self, x):
self.cost.append(x)
self.cumulative_cost.append( self.cumulative_cost[len(self.cumulative_cost)-1]+x if len(self.cumulative_cost)>0 else x)
self.cumulative_square = self.cumulative_square+x*x
# Renvoie la somme des couts enregistres dans cette analyse.
# Complexite en temps/espace, meilleur cas : O(1)
# @returns la somme des couts enregistres dans cette analyse.
def get_total_cost(self):
return self.cumulative_cost[len(self.cumulative_cost)-1]
# Renvoie le cout amorti d'une operation.
# Complexite en temps/espace, meilleur cas : O(1)
# @param pos est l'indice de l'operation pour laquelle on veut connaitre le cout amorti.
# @returns le cout amorti d'une operation.
def get_amortized_cost(self, pos):
return self.cumulative_cost[pos]/pos if pos>0 else self.cumulative_cost[pos]
# Renvoie la moyenne des couts de toutes les operations enregistrees dans l'analyse.
# Complexite en temps/espace, meilleur cas : O(1)
# @returns la moyenne des couts de toutes les operations enregistrees dans l'analyse.
def get_average_cost(self):
if len(self.cumulative_cost) == 0:
raise Exception('List is empty')
return self.cumulative_cost[len(self.cumulative_cost)-1]/len(self.cumulative_cost);
# Renvoie la variance des couts de toutes les operations enregistrees dans l'analyse.
# Complexite en temps/espace, meilleur cas : O(1)
# @returns la variance des couts de toutes les operations enregistrees dans l'analyse.
def get_variance(self):
mean = self.get_average_cost()
mean_square = mean*mean
return self.cumulative_square - mean_square
# Renvoie l'ecart-type des couts de toutes les operations enregistrees dans l'analyse.
# Complexite en temps/espace, meilleur cas : O(1)
# @returns l'ecart-type des couts de toutes les operations enregistrees dans l'analyse.
def get_standard_deviation(self):
return math.sqrt(self.get_variance())
# Sauvegarde la liste des couts et des couts amortis dans un fichier.
# Complexite en temps, meilleur/pire cas : O(size)
# @param path est le chemin du fichier dans lequel la sauvegarde est faite.
def save_values(self, path):
f = open(path, 'w')
for i in range(len(self.cost)):
f.write(str(i)+" "+str(self.cost[i])+" "+str(self.get_amortized_cost(i))+"\n")
f.close()